Làm thế nào để cắt (chọn) một trường từ dòng văn bản đếm từ cuối?


32

Tôi biết cách chọn một trường từ một dòng bằng lệnh cắt. Chẳng hạn, đưa ra các dữ liệu sau:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

Lệnh này:

cut -d, -f2 # returns the second field of the input line

Trả về:

b
g
l

Câu hỏi của tôi: Làm thế nào tôi có thể chọn trường thứ hai đếm từ cuối? Trong ví dụ trước, kết quả sẽ là:

d
i
n

Câu trả lời:


52

Đảo ngược đầu vào trước và sau cutvới rev:

<infile rev | cut -d, -f2 | rev

Đầu ra:

d
i
n

1
Tôi có nhiều đoạn nhỏ trong thư mục bin của mình. rcut là chính xác này: #! / bin / bash rev | cắt "$ @" | rev
John Allsup

2
Thật tệ khi cutkhông thể lấy các chỉ số trường phủ định (như Python).
Keith Devens

10

Hãy thử làm điều này với :

awk -F, '{print $(NF-1)}' file.txt

Hoặc sử dụng :

perl -F, -lane 'print $F[-2]' file.txt

Hoặc sử dụng (cảm ơn manatwork):

ruby -F, -lane 'print $F[-2]' file.txt

Hoặc sử dụng bash(cảm ơn manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

Hoặc sử dụng :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bashkhông cần số cột cố định cho việc này : while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
manatwork

1
BTW, giải pháp thứ ba của bạn cũng hoạt động nếu bạn thay đổi perlvới ruby.
manatwork

Cảm ơn, rubythêm, bashchỉnh sửa.
Gilles Quenot

1
Nếu trường thứ 4 có thể bắt đầu bằng -hoặc (tùy thuộc vào môi trường, trình bao hoặc cách trình bao được biên dịch), có thể chứa các ký tự dấu gạch chéo ngược, thì đó echokhông phải là một tùy chọn. Tại sao bạn cần phải catthi hành file.txtkhông có gì trước khi cho nó ăn python!?. Bạn cần read -Athay vì read -atrong ksh93zsh. Các mục con tiêu cực hoạt động trong zshnhưng chỉ trong các phiên bản gần đây của ksh93bash. Trong các phiên bản cũ hơn, bạn có thể sử dụng${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, tôi nghĩ bạn có nghĩa ${d[@]: -2:1}trong câu cuối cùng của bạn.
thao tác

0

Sử dụng sed:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

Đầu ra:

d
i
n

Giải trình

  • ([^,]*,)* phù hợp với bất kỳ số lượng người đánh dấu không dấu phẩy nào theo sau là dấu phẩy, tức là bất kỳ số lượng cột nào.
  • ([^,]*) phù hợp với một cột.
  • (,[^,]*){1}khớp với một cột ở cuối, nếu bạn thay đổi bộ định lượng {1}thành {2}cột khớp với cột thứ hai từ cuối, v.v.
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.