Использование 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
Вы также можете остановиться на своем решении:
cat temp.txt | grep ^$labelNum | awk '{print $2}'
Которое будет соответствовать началу строки или
awk '/^'$labelNum'/{print $2}' temp.txt
Будет работать одинаково, но внутри awk экранирование сложное.
С одним awk :
awk -v lbl=$labelNum '$1 == lbl{ print $2 }' temp.txt
-v lbl=$labelNum
- передача значения переменной labelNum
в скрипт awk
$1 == lbl
- если значение 1-го столбца равно значению переменной - выполняется следующее выражение