Напишите файл, используя AWK на Linux - PullRequest
0 голосов
/ 16 мая 2018

У меня есть файл, который имеет несколько строк, из которых одна строка

-xxxxxxxx()xxxxxxxx

Я хочу добавить содержимое этой строки в новый файл

Я сделал это:

awk ' /^-/ {system("echo" $0 ">" "newline.txt")} '

но это не работает, он возвращает ошибку, которая говорит:

Unnexpected token '(' 

Я полагаю, это связано с () присутствующим в строке. Как преодолеть эту проблему?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Вам нужно добавить правильные пробелы!

С вашим ошибочным awk ' /^-/ {system("echo" $0 ">" "newline.txt")} ' команда оболочки по сути является echo-xxxxxxxx()xxxxxxxx>newline.txt, что, безусловно, не работает. Вам необходимо создать правильную команду оболочки внутри строки awk и подчиниться правилам конкатенации строк awk, т.е. ваш предполагаемый сценарий должен выглядеть следующим образом (который все еще не работает, потому что $0 неправильно указан в кавычках команда оболочки):

awk '/^-/ { system("echo " $0 " > newline.txt") }'

Однако, если вам действительно нужно echo $0 в файл, вы можете просто сделать:

awk '/^-/ { print $0 > "newline.txt" }'

Или еще проще

awk '/^-/' > newline.txt

Который, по существу, применяет операцию по умолчанию ко всем записям, соответствующим /^-/, в результате чего операция по умолчанию равна print, что является сокращением для аккуратной печати текущей записи, т.е. этот скрипт просто отфильтровывает нужные записи. Перенаправление > newline.txt вне awk просто помещает его в файл.

0 голосов
/ 16 мая 2018

Прежде всего, для простого извлечения шаблонов из файла вам не нужно использовать awk это избыточное количество, grep будет более чем достаточно для задачи:

ВХОД:

$ more file
123
-xxxxxxxx()xxxxxxxx
abc
-xyxyxxux()xxuxxuxx
123
abc
123

Команда:

$ grep -oE '^-[^(]+\(\).*' file                                                                                                  
-xxxxxxxx()xxxxxxxx
-xyxyxxux()xxuxxuxx

объяснения:

Опция: -oE для определения вывода как шаблона, а не всей строки (может быть удалена) Regex: ^-[^(]+\(\).* выберет строки, которые начинаются с - и содержат ()

Вы можете перенаправить вывод в new_file, добавив > new_file в конце вашей команды.

0 голосов
/ 16 мая 2018

Вам не нужны команды system, echo, просто:

awk '/^-/ {print $1}' file > newfile

Это будет захватывать строки, начинающиеся с -, и обрезать остальные, если есть пробел.

awk '/^-/ {print $0}' file > newfile

Будет захватывать всю строку, включая пробелы.

Вы также можете использовать grep :

grep -o '^-.*' file > newfile

Захватывает любые строки, начинающиеся с -

grep -o '^-.*().*' file > newfile

будет более конкретным и будет содержать строки, начинающиеся с -, также содержащие ()

...