Jak wyciąć (wybrać) pole z liczenia linii tekstu od końca?


32

Wiem, jak wybrać pole z linii za pomocą polecenia cięcia. Na przykład, biorąc pod uwagę następujące dane:

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

To polecenie:

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

Zwroty:

b
g
l

Moje pytanie: Jak mogę wybrać drugie pole liczące od końca? W poprzednim przykładzie wynikiem byłoby:

d
i
n

Odpowiedzi:


52

Odwróć wejście przed i po za cutpomocą rev:

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

Wydajność:

d
i
n

1
Mam wiele małych fragmentów w folderze bin. rcut służy właśnie do tego: #! / bin / bash rev | wyciąć „$ @” | rev
John Allsup,

2
Szkoda, że cutnie może przyjmować ujemnych wskaźników pola (takich jak Python).
Keith Devens,

10

Spróbuj to zrobić z :

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

Lub używając :

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

Lub używając (dzięki manatwork):

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

Lub używając bash(dzięki manatwork):

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

Lub używając :

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

1
bashnie potrzebuje stałą liczbę kolumn dla tego: while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
manatwork

1
BTW, twoje trzecie rozwiązanie działa również, jeśli zmienisz za perlpomocą ruby.
manatwork

Dzięki, rubydodane, bashedytowane.
Gilles Quenot

1
Jeśli czwarte pole może zaczynać się od -lub (w zależności od środowiska, powłoki lub sposobu skompilowania powłoki), może zawierać znaki odwrotnego ukośnika, echonie jest to możliwe. Dlaczego musisz catpodawać file.txtsię do niczego przed karmieniem python! Potrzebujesz read -Azamiast read -aw ksh93i zsh. Negatywne indeksy dolne działają zshtylko w najnowszych wersjach ksh93i bash. W starszych wersjach możesz użyć${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, myślę, że masz na myśli ${d[@]: -2:1}ostatnie zdanie.
manatwork

0

Za pomocą sed:

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

Wydajność:

d
i
n

Wyjaśnienie

  • ([^,]*,)* dopasowuje dowolną liczbę znaków oddzielających przecinek, po których następuje przecinek, tj. dowolną liczbę kolumn.
  • ([^,]*) dopasowuje kolumnę.
  • (,[^,]*){1}mecze jedną kolumnę na końcu, jeśli zmienić kwantyfikator {1}do {2}pasuje drugą kolumnę od końca etc.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.