Наприклад, у мене є файл:
$ 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локально (для всіх випадків)Список літератури: