Tất cả những gì tôi muốn là in hai cột cuối cùng.
Tất cả những gì tôi muốn là in hai cột cuối cùng.
Câu trả lời:
Bạn có thể sử dụng biến NF
được đặt thành tổng số trường trong bản ghi đầu vào:
awk '{print $(NF-1),"\t",$NF}' file
điều này giả định rằng bạn có ít nhất 2 trường.
awk '{print $(NF-1) "\t" $NF}' file
hoặc awk '{print $(NF-1), $NF}' file
hoặc awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
là awk diễn giải mỗi biến được phân tách bằng dấu phẩy là trường riêng của nó, vì vậy kết quả thực sự sẽ là field1<space><tab><space>field2
, (vì nó sẽ sử dụng dấu phân cách khoảng trắng theo mặc định) trái ngược với field1<tab>field2
có thể là bạn đang mong đợi. sử dụng Dấu phân tách trường đầu ra (OFS) hầu như luôn là điều bạn muốn.
awk '{print $NF-1, $NF}' inputfile
Lưu ý: điều này chỉ hoạt động nếu tồn tại ít nhất hai cột. Trên các bản ghi có một cột, bạn sẽ nhận được"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
là ($NF) - 1
trong mọi awk
triển khai.
yacc
ngữ pháp, điều này thật trớ trêu khi chữ A là viết tắt của awk. Các phiên bản khác nhau của awk phân tích cú pháp mọi thứ khác nhau? Bất ngờ lớn!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- hoặc bất kỳ đầu vào nào khác trong đó trường cuối cùng thứ 2 không nhỏ hơn trường cuối cùng một lần.
McNamara @jim: hãy thử sử dụng dấu ngoặc đơn cho khoảng NF
, tức $(NF-1)
và $(NF)
thay $NF-1
và $NF
(các công trình trên Mac OS X 10.6.8 cho FreeBSD awk
và gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
- mà ít nhất là linh hoạt hơn $NF-1
; nó chắc chắn ít mơ hồ hơn. $(NF)
là quá mức cần thiết, mặc dù - chỉ $NF
sẽ làm. Việc bảo vệ chống lại các dòng có ít hơn 2 cột cũng đáng giá, vì với các dòng một cột, bạn sẽ nhận được giá trị cột đầu tiên hai lần và với cột 0 - tức là các dòng trống - lệnh awk sẽ hoàn toàn thất bại, do một nỗ lực để truy cập trường có chỉ mục -1.
sử dụng gawk cho thấy vấn đề:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Tôi chỉ đặt gawk trên Solaris 10 M4000: Vì vậy, gawk là lý thuyết của vấn đề $ NF-1 so với $ (NF-1). Câu hỏi tiếp theo POSIX nói gì? mỗi:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Không có hướng này hay cách khác. Không tốt. gawk ngụ ý phép trừ, các awk khác ngụ ý số trường hoặc phép trừ. hmm.
$(NF-1)
là hai ví dụ về tính toán chỉ mục trường trong thông số kỹ thuật đều sử dụng dạng đó: $(NF-1)
và $(NF+2)
. Sau đó, có phần "Biểu thức trong awk", được liệt kê $expr
là có mức độ ưu tiên cao hơn [nhiều] expr - expr
. Vì NF
là một biểu thức chính nó, $NF-1
nên đánh giá đến ($NF)-1
. Ngay cả khi, sau khi tất cả, có thực sự awk triển khai trên mạng mà đánh giá $NF-1
như $(NF-1)
, bài học học được ở đây là sử dụng $(NF-1)
là sự lựa chọn an toàn và di động.
thử với cái này
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
Vui lòng thử điều này để tính đến tất cả các trường hợp có thể xảy ra:
awk '{print $(NF-1)"\t"$NF}' file
hoặc là
awk 'BEGIN{OFS="\t"}' file
hoặc là
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file