Запись информации в другой файл с помощью awk-скрипта

$ sed -n '/xyz/,$p' file.txt > file2.txt

С помощью -nмы запрещаем sedпечатать каждую строку. С $означает конец файла, конец pозначает строку печати. Таким образом, /xyz/$pозначает :. Если строка соответствует xyz, выведите ее до конца файла.

0
03.01.2020, 17:25
2 ответа

Вы не можете перенаправить вывод блока вawk(это относится к более ранней версии вопроса). Вам также необходимо заключить в двойные кавычки имя выходного файла (, это также относится к более ранней версии вопроса). Пустые блоки BEGINи ENDмогут быть полностью удалены.

Вместо этого, если вы просто хотите добавить ко всем строкам файла префикс Hello N, где N— целое число, соответствующее номеру текущей строки (, это как раз то, что я могу сделать для вас. хотите сделать, и код был существенно изменен хотя бы один раз во время написания этого ответа; вы, очевидно, можете изменить это, чтобы делать все, что вам действительно нужно ), используйте

{
    printf "Hello %d%s%s\n", NR, OFS, $0 >"hellofile1"

    # or:  print "Hello " NR, $0 >"hellofile1"
}

Каждая строка входного файла печатается в файл hellofile1с префиксом строки Hello , номером строки и разделителем выходных полей (пробелом по умолчанию ).

Выходной файл hellofile1будет усечен из-за >, но awkсохраняет файл открытым для записи до тех пор, пока он не будет явно закрыт (, чего здесь не происходит ), или до тех пор, пока программа завершается, поэтому весь вывод программы будет правильно напечатан в файл (последующие вызовы print >будут добавлены к уже открытому файлу ).

Другой способ сделать это:

{
    for (i = NF; i >= 1; --i)
        $(i+1) = $i

    $1 = sprintf("Hello %d", NR)    # or:  $1 = "Hello " NR
    print >"hellofile1"
}

Это перемещает существующие поля «вправо» на одно поле и вставляет строку Hello Nв качестве первого поля в записи. Затем он печатает запись в выходной файл. Обратите внимание, что этот re -формирует записи и разделяет их поляOFS(пробелом по умолчанию )в выводе.

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

$ awk -f script.awk myfile

где myfile— файл, который вы хотели бы использовать в качестве входных данных.

3
28.01.2020, 02:38

$1 , > и >> — это понятия из bash, но интерпретатор вашего скрипта — /bin/awk (согласно первой строке скрипта ). ИМХО, вы можете попробовать вызвать скрипт awk из скрипта bash или попробовать использовать HEREDOC, чтобы все было внутри одного файла.

Обновление :bash/awk здесь пример документа здесь

-2
28.01.2020, 02:38

Теги

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