Tôi muốn in cột hoặc trường cuối cùng thứ hai trong awk. Số lượng các lĩnh vực là biến. Tôi biết rằng tôi sẽ có thể sử dụng $NFnhưng không chắc làm thế nào nó có thể được sử dụng.
Và điều này dường như không hoạt động:
awk ' { print ( $NF-- ) } '
Tôi muốn in cột hoặc trường cuối cùng thứ hai trong awk. Số lượng các lĩnh vực là biến. Tôi biết rằng tôi sẽ có thể sử dụng $NFnhưng không chắc làm thế nào nó có thể được sử dụng.
Và điều này dường như không hoạt động:
awk ' { print ( $NF-- ) } '
Câu trả lời:
awk '{print $(NF-1)}'
Nên làm việc
awk -F '.' '{print $(NF-2)}'
$(..)gọi một lệnh trong một lớp con tùy thuộc vào lớp vỏ bạn đang sử dụng. Bạn có thể làm việc xung quanh điều này bằng cách sử dụng $ (NF-1)thay vì $(NF-1).
Bổ sung nhỏ vào câu trả lời được chấp nhận của Chris Kannon: chỉ in nếu thực sự có cột thứ hai cuối cùng.
(
echo | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)
Nó đơn giản nhất:
awk '{print $--NF}'
Lý do ban đầu $NF--không hoạt động là vì biểu thức được đánh giá trước khi giảm, trong khi việc giảm tiền tố của tôi được thực hiện trước khi đánh giá.
int x = ++i int x = i++, v.v. , tiền tố có nghĩa là tăng trước; postfix có nghĩa là tăng sau (gán trước).
awk ' { print ( $(NF-1) ) }' file
Bạn không xa kết quả! Cái này làm được
awk '{NF--; print $NF}' file
Điều này làm giảm số lượng các trường trong một, do đó $NFcó chứa áp chót trước đây.
Hãy tạo một số số và in chúng trên các nhóm 5:
$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
Hãy in áp chót trên mỗi dòng:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
Giải pháp Perl tương tự như giải pháp awk của Chris Kannon:
perl -lane 'print $F[$#F-1]' file
Các tùy chọn dòng lệnh này được sử dụng:
n lặp xung quanh mỗi dòng của tệp đầu vào, không tự động in mọi dòng
l xóa các dòng mới trước khi xử lý và thêm chúng trở lại sau đó
achế độ tự động - chia dòng đầu vào thành @Fmảng. Mặc định để phân tách trên khoảng trắng
e thực thi mã perl
Các @Fmảng autosplit giá khởi điểm chỉ số [0] trong khi lĩnh vực awk bắt đầu với $ 1.
$#Flà số phần tử trong@F
$F[-2]
NFlà chỉ số trường cuối cùng,$NFlà giá trị của trường cuối cùng