awk / sed chỉ in tối đa ký tự gạch dưới


10

Làm cách nào tôi có thể sử dụng awk hoặc sed để in một chuỗi chỉ tối đa ký tự gạch dưới đầu tiên?

Trước:

host100_044 2
host101_045 2
host102_046 2

Sau:

host100
host101
host102

Câu trả lời:


20

Điều này có thể được thực hiện với cut:

cut -d _ -f 1

ví dụ

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

Ngoài ra với awkcó thể được thực hiện với awk -F_ '{print $1}'(có thể có một cách sạch hơn để làm điều đó)


@Renan Làm cách nào để sửa đổi hàm cắt này nếu tôi muốn đầu ra chứa tất cả thông tin đầu vào bên cạnh việc thực hiện cắt?
BioMan

2

Một lựa chọn khác cho sed:

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

Nếu bạn có những thứ này trong một tập tin, bạn có thể gọi nó như sau;

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-

Đầu ra:

host100 host101 host102

Với dòng mới:

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

Đầu ra:

host100
host101
host102

1

Sử dụng sed:

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


Sử dụng sedtùy chọn chỉnh sửa tại chỗ,

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

Đã viết như vậy, mặc dù awkgiải pháp đã được đăng (và cutcó lẽ là tốt nhất trong trường hợp này), vì anh ấy đã hỏi sed, nhưng bạn đã đánh bại tôi trong vài giây :-). Bạn thậm chí có thể loại bỏ $, vì nó sẽ khớp .*với cuối dòng theo mặc định.
Daniel Andersson

@DanielAndersson: vâng.
Hoàng tử John Wesley

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

Các -F'_'hướng dẫn awksử dụng dấu gạch dưới làm dấu phân cách trường. Bản awkthân kịch bản chỉ in trường đầu tiên.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.