grep последнее слово заданной строки .csv файла

$ grep -c '\.java$' file
3

Флаг -c для grep заставит его сообщить количество строк во входных данных, соответствующих шаблону.

Шаблон \.java$ будет соответствовать любой строке, заканчивающейся на .java.

$ name="file"
$ printf 'Total number of Java files in "%s":\t%d\n' "$name" "$( grep -c -- '\.java$' "$name" )"
Total number of Java files in "file":   3

Или даже просто (с GNU grep или совместимым):

$ grep -Hc '\.java$' file
file:3

Или (по-прежнему с GNU grep):

$ grep --label='Total java files in "file"' -Hc '\.java$' < file
Total java files in "file":3
0
14.03.2017, 22:55
2 ответа

Использование awk:

$ awk -v num="$num" 'NR == num { print $NF }' data.in

Проверка:

$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two

Сценарий awk читает входной файл запись за записью (по умолчанию запись - это строка). Как только он находит запись, соответствующую переменной num, он печатает последнее поле этой записи (по умолчанию поле - это столбец, разделенный пробелами).

Переменная num внутри сценария awk - это переменная awk, которую мы инициализируем значением переменной оболочки num с помощью -v num="$num" в командной строке.

NR - это номер текущей записи, а NF - количество полей в этой записи. $NF - это данные последнего поля.

Если ваш файл строго разделен запятыми, добавьте -F ',' в командную строку:

$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in

С помощью grep вы не можете выбрать конкретную строку, но вместе с sed вы можете отфильтровать нужную вам строку и получить последний бит после последней запятой:

$ sed -n "${num}p" data.in | grep -o '[^,]*$'

Бит sed получит указанную строку, а бит grep извлечет все после последней запятой в этой строке.

Это можно сделать и с помощью sed:

$ sed -n "${num}s/^.*,\(.*\)$/\1/p" data.in

Здесь подстановка применяется только к строке, номер которой $num, заменяет всю строку содержимым строки после последней запятой и выводит результат. Весь остальной вывод блокируется с помощью переключателя командной строки -n.

В качестве альтернативы используйте подстановку в sed, чтобы просто удалить все содержимое строки до последней запятой:

$ sed -n "${num}s/^.*,//p" data.in
5
28.01.2020, 02:15

В awk NR - номер строки, NF - количество столбцов, поэтому $NF - последний столбец. FS - разделитель входных записей, ', ' для CSV без кавычек запятых должно быть достаточно.

awk -v FS=', ' 'NR==3{print $NF}'
1
28.01.2020, 02:15

Теги

Похожие вопросы