awk / sed untuk mencetak hanya hingga karakter garis bawah


10

Bagaimana saya bisa menggunakan awk atau sed untuk mencetak string hanya hingga karakter garis bawah pertama?

Sebelum:

host100_044 2
host101_045 2
host102_046 2

Setelah:

host100
host101
host102

Jawaban:


20

Ini dapat dilakukan dengan cut:

cut -d _ -f 1

misalnya

$ echo host100_044 2 | cut -d _ -f 1
host100

Juga dengan awkdapat dilakukan dengan awk -F_ '{print $1}'(mungkin ada cara yang lebih bersih untuk melakukan itu)


@Renan Bagaimana cara memodifikasi fungsi potong ini jika saya ingin output berisi semua informasi input selain melakukan pemotongan?
BioMan

2

Alternatif lain untuk sed:

echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'

Jika Anda memiliki ini dalam file, Anda bisa menyebutnya sebagai berikut;

cat fileName | sed 's/^\(.*\)_.*$/\1/'

1
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}'  | cut -d ' ' -f2-

Keluaran:

host100 host101 host102

Dengan baris baru:

echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'

Keluaran:

host100
host101
host102

1

Menggunakan sed:

echo host100_044 2 | sed 's;_.*;;'


Menggunakan sedopsi edit di tempat,

sed -i.old 's;_.*;;' infile

Baru saja menulis yang sama, meskipun awksolusi sudah diposting (dan cutmungkin yang terbaik dalam hal ini), karena dia bertanya sed, tetapi Anda mengalahkan saya dengan detik :-). Anda bahkan dapat menghapusnya $, karena itu akan cocok .*dengan akhir baris secara default.
Daniel Andersson

@DanielAndersson: ya.
Pangeran John Wesley

1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

The -F'_'menginstruksikan awkuntuk menggunakan garis sebagai pembatas lapangan. The awkScript itu sendiri hanya mencetak field pertama.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.