Ответ 1
Получил подсказку Unix, за исключением последних двух токенов, и смог найти ответ:
cat datafile | rev | cut -d '/' -f 2 | rev
У меня есть набор данных в качестве входных данных и требуется второе последнее поле на основе делеиметра. Строки могут иметь разное количество разделителей. Как я могу получить второе последнее поле?
пример ввода
text,blah,blaah,foo
this,is,another,text,line
ожидаемый выход
blaah
text
Получил подсказку Unix, за исключением последних двух токенов, и смог найти ответ:
cat datafile | rev | cut -d '/' -f 2 | rev
Awk подходит для этого:
awk -F, '{print $(NF-1)}' file
Переменная NF - это специальная переменная awk, содержащая количество полей в текущей записи.
Здесь нет необходимости использовать cut
, rev
или любые другие инструменты, внешние по отношению к bash. Просто прочитайте каждую строку в массиве и выберите нужный фрагмент:
while IFS=, read -r -a entries; do
printf '%s\n' "${entries[${#entries[@]} - 2]}"
done <file
Выполнение этого в чистом bash намного быстрее, чем запуск конвейера, по крайней мере, для разумно малых входов. Для больших входов лучший инструмент - awk.
Код для GNU sed:
$ 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
, например. awk или excel.
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
.
Решение Perl аналогично решению awk из @iiSeymour
perl -lane 'print $F[-2]' file
Используются следующие параметры командной строки:
n
перемещаться по каждой строке входного файла, не печатать автоматически каждую строку
l
удаляет символы новой строки перед обработкой и добавляет их обратно
a
режим автосплит - разделение входных строк на массив @F. По умолчанию разделение на пробелы
e
выполнить код perl
Массив autosplit @F
начинается с индекса [0], тогда как awk-поля начинаются с $1 -1
- последний элемент
-2
- это второй и последний элементы