Як вирізати (вибрати) поле з підрахунку рядків тексту з кінця?


32

Я знаю, як вибрати поле з рядка за допомогою команди cut. Наприклад, з урахуванням таких даних:

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

Ця команда:

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

Повернення:

b
g
l

Моє запитання: Як я можу вибрати друге поле, що рахує кінець? У попередньому прикладі результат був би:

d
i
n

Відповіді:


52

Зворотне введення до і після того, як cutз rev:

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

Вихід:

d
i
n

1
У моїй папці сміття є багато маленьких фрагментів. rcut саме для цього: #! / bin / bash rev | вирізати "$ @" | rev
Джон Алсуп

2
Це дуже погано, cutне можна приймати негативні показники поля (наприклад, Python).
Кіт Дівенс

10

Спробуйте зробити це з :

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

Або за допомогою :

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

Або використовуючи (спасибі манатурка):

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

Або використовуючи bash(спасибі манатурка):

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

Або за допомогою :

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

1
bashне потребує в нерухомому кількості стовпців для цього: while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
манатурка

1
До речі, ваше третє рішення також працює, якщо ви перейдете perlна ruby.
манатурка

Спасибі, rubyдодані, bashвідредаговані.
Жиль Кінот

1
Якщо 4-е поле може починатися з -(або залежно від середовища, оболонки чи способу складання оболонки), може містити символи зворотної косої риси, то echoце не є варіантом. Чому вам потрібно catні file.txtз чим не ласувати, перш ніж годувати його python?!. Вам потрібно read -Aзамість read -aв ksh93і zsh. Негативні підписки працюють, zshале лише в останніх версіях ksh93та bash. У старих версіях можна використовувати${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, я думаю , що ви маєте в виду ${d[@]: -2:1}в останньому реченні.
манатура

0

Використання sed:

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

Вихід:

d
i
n

Пояснення

  • ([^,]*,)* відповідає будь-якій кількості символів, що не ставлять комами, а потім комою, тобто будь-якій кількості стовпців.
  • ([^,]*) відповідає стовпцю.
  • (,[^,]*){1}відповідає один стовпець в кінці, якщо ви зміните квантор {1}на {2}це відповідає другий стовпець з кінця і т.д.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.