Найти две строки переменных и записать одну в файл [закрыто]

У меня есть текстовый документ, который содержит 2 строки информации. Строка 1 содержит имя файла, а строка 2 содержит идентификатор ссылки. Документ содержит дополнительные строки, кроме нужной информации, и я пытаюсь придумать незагромождающий способ собрать только ту информацию, которую я хочу. Использование 'cut -d' несколько раз кажется неаккуратным.

Вот пример моих данных

12:"content":"file;\r\n\tfilename=\"TestingFile.txt"} 
13-"refid":"9B46BCAEDC9923"}]

Используя эту информацию, я хочу создать файл TestingFile.txt и записать значение refid в качестве содержимого - в основном значения между " " и ничего больше.

tfilename=\" и refid":" всегда будут предшествовать данным, которые я хочу захватить, и в строке всегда будет несколько символов после последнего ".

0
задан 24 October 2014 в 08:27

1 ответ

awk -F'"' 'NR==1 {fname=$(NF-1);} NR==2{print $(NF-1) >fname;}' file

Объяснение

awk неявно циклы через каждую строку файла. Каждая строка разделена на поля.

  • -F'"'

    Это делает функцию символа двойной кавычки как разделителя полей. При рассмотрении демонстрационного входа, который означает, что поля, которые мы хотим, будут предпоследним на каждой строке

  • NR==1 {fname=$(NF-1);}

    , первая строка имеет имя файла. В awk, NF количество полей на строке. Так, $(NF-1) ссылки предпоследнее поле. Его содержание сохраняется в переменную fname.

  • NR==2{print $(NF-1) >fname;}

    вторая строка имеет идентификатор как свое предпоследнее поле. Мы print этот идентификатор в файл, названный fname.

Пример

, Если вышеупомянутый код выполняется против демонстрационного входа, файл TestingFile.txt создается в текущем каталоге:

$ cat TestingFile.txt
9B46BCAEDC9923

более сложный вход

предположим, что входной файл похож:

12:"content":"file;\r\n\tfilename=\"TestingFile.txt","date":"2014-10-23"} 
13-"refid":"9B46BCAEDC9923","author":"Anon"}]

, Так как наши данные больше не будут предпоследними полями, мы должны измениться эти awk код:

awk -F'"' 'NR==1 {sub(/.*tfilename=\\"/, "");fname=$1;} NR==2 {sub(/.*refid":"/,"");print $1>fname;}' file2

Этот код удаляет все символы перед именем файла (строка 1) или идентификатор (строка 2). Как только это было сделано, информация, которую мы хотим, будет в поле 1. Код является иначе тем же.

2
ответ дан 6 October 2019 в 22:27

Другие вопросы по тегам:

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