Как получить второе последнее поле из команды cut

У меня есть набор данных в качестве входных данных и требуется второе последнее поле на основе делеиметра. Строки могут иметь разное количество разделителей. Как я могу получить второе последнее поле?

пример ввода

text,blah,blaah,foo
this,is,another,text,line

ожидаемый выход

blaah
text

Ответ 2

Awk подходит для этого:

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

Переменная NF - это специальная переменная awk, содержащая количество полей в текущей записи.

Ответ 3

Здесь нет необходимости использовать cut, rev или любые другие инструменты, внешние по отношению к bash. Просто прочитайте каждую строку в массиве и выберите нужный фрагмент:

while IFS=, read -r -a entries; do
  printf '%s\n' "${entries[${#entries[@]} - 2]}"
done <file

Выполнение этого в чистом bash намного быстрее, чем запуск конвейера, по крайней мере, для разумно малых входов. Для больших входов лучший инструмент - awk.

Ответ 4

Код для GNU :

$ echo text,blah,blaah,foo|sed -r 's/^(\S+,){2}(\S+),.*/\2/'
blaah

$ echo this,is,another,text,line|sed -r 's/^(\S+,){2}(\S+),.*/\2/'
text

Пример кода, аналогичный sudo_O awk code:

$ sed -r 's/.*,(\w+),\w+$/\1/' file
blaah
text

Возможно, было бы лучше использовать более специализированные программы для файлов CSV, например. или .

Ответ 5

Самый минималистский ответ на эту проблему - использовать мою утилиту cuts:

$ cat file.txt
text,blah,blaah,foo
this,is,another,text,line

$ cuts -2 file.txt
blaah
text

cuts, что означает "сокращение стероидов":

- automatically figures out the input field separators
- supports multi-char (and regexp) separators
- automatically pastes (side-by-side) multiple columns from multiple files
- supports negative offsets (from end of line)
- has good defaults to save typing + allows the user to override them

и многое другое.

Я написал cuts после разочарования слишком большим количеством ограничений cut в Unix. Он предназначен для замены различных столбцов cut/paste комбо, разрезания и декодирования из нескольких файлов с несколькими вариантами разделителя, в то же время вводя минимальный набор текста от пользователя.

Вы можете получить cuts (бесплатное программное обеспечение, художественную лицензию) из github: https://github.com/arielf/cuts/

Вызов cuts без аргументов напечатает подробное сообщение Usage.

Ответ 6

Решение Perl аналогично решению awk из @iiSeymour

perl -lane 'print $F[-2]' file

Используются следующие параметры командной строки:

  • n перемещаться по каждой строке входного файла, не печатать автоматически каждую строку

  • l удаляет символы новой строки перед обработкой и добавляет их обратно

  • a режим автосплит - разделение входных строк на массив @F. По умолчанию разделение на пробелы

  • e выполнить код perl

Массив autosplit @F начинается с индекса [0], тогда как awk-поля начинаются с $1
-1 - последний элемент -2 - это второй и последний элементы