Например, у меня есть файл:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
и мне нужно:
example, line, file
Я намерен использовать "awk", но проблема в том, что слова находятся в другом месте
Например, у меня есть файл:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
и мне нужно:
example, line, file
Я намерен использовать "awk", но проблема в том, что слова находятся в другом месте
Ответы:
Пытаться
$ awk 'NF>1{print $NF}' file
example.
line.
file.
Чтобы получить результат в одну строку, как в вашем примере, попробуйте:
{
sub(/\./, ",", $NF)
str = str$NF
}
END { print str }
вывод:
$ awk -f script.awk file
example, line, file,
Чистый баш:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
$NF»?
##или просто попробовать его в раковине.
Вы можете легко сделать это с помощью grep:
grep -oE '[^ ]+$' file
( -Eиспользовать расширенное регулярное выражение; -oвыводить только совпавший текст вместо полной строки)
grep -oE '[^ ]+$', вы хотите видеть вкладку здесь из-за поведения браузера, но в любом случае здесь учитываются и пространства вкладок, или, что еще лучше, вы можете это сделать,grep -oE '[^[:space:]]+$'
В awk можно сделать что-то вроде этого:
awk '{ print $NF }'
Изменить: чтобы избежать пустой строки:
awk 'NF{ print $NF }'
Другой способ сделать это в обычном bash - использовать следующую revкоманду:
cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
По сути, вы меняете строки файла, затем разделяете их, cutиспользуя пробел в качестве разделителя, берете первое поле, которое cutсоздает, а затем снова меняете токен, используете tr -dдля удаления ненужных символов и trснова для замены символов новой строки на,
Кроме того, вы можете избежать появления первого кота, выполнив:
rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
Есть много способов. как awkпоказывают решения, это чистое решение
Решение sed - удалить что-либо до последнего пробела. Так что, если в конце нет места, он должен работать
sed 's/.* //g' <file>
вы также можете избежать sedи пойти на whileпетлю.
while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file
он читает строку, уважает ее, отсекает первую (т.е. последнюю в оригинале) и восстанавливает обратно
то же самое можно сделать в чистом виде
while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file
это называется расширением параметров
tldr;
$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
Для такого файла
$ cat file.txt
The quick brown fox
jumps over
the lazy dog.
данная команда напечатает
fox, over, dog.
Как это устроено:
awk '{print $NF}' : печатает последнее поле каждой строкиpaste -sd,: читает stdinпоследовательно (по -sодному файлу за раз) и записывает поля с разделителями-запятыми ( -d,)sed 's/,/, /g': substitutes ","с ", " gлобалли (для всех экземпляров)Рекомендации: