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:
Odwróć wejście przed i po za
cut
pomocąrev
:Wydajność:
źródło
cut
nie może przyjmować ujemnych wskaźników pola (takich jak Python).Spróbuj to zrobić z awk :
Lub używając Perla :
Lub używając ruby (dzięki manatwork):
Lub używając
bash
(dzięki manatwork):Lub używając Pythona :
źródło
bash
nie potrzebuje stałą liczbę kolumn dla tego:while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt
.perl
pomocąruby
.ruby
dodane,bash
edytowane.-
lub (w zależności od środowiska, powłoki lub sposobu skompilowania powłoki), może zawierać znaki odwrotnego ukośnika,echo
nie jest to możliwe. Dlaczego musiszcat
podawaćfile.txt
się do niczego przed karmieniempython
! Potrzebujeszread -A
zamiastread -a
wksh93
izsh
. Negatywne indeksy dolne działajązsh
tylko w najnowszych wersjachksh93
ibash
. W starszych wersjach możesz użyć${d: -2:1}
${d[@]: -2:1}
ostatnie zdanie.Za pomocą sed:
Wydajność:
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.źródło