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
Rubstr
sumber

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
sumber
@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/'
penulis naskah
sumber
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
jftuga
sumber
1

Menggunakan sed:

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


Menggunakan sedopsi edit di tempat,

sed -i.old 's;_.*;;' infile
Pangeran John Wesley
sumber
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.

Sergey Fadeev
sumber
0

Ini akan mencetak output sebelum _:

sed 's/_.*//' -filename

y.kashyap007
sumber