В приведенной ниже задаче я могу получить случайную строку из файла file1 с помощью awk, и я могу редактировать файл file2 с помощью awk, если я просто записываю фиксированную строку в выходной файл, но если я хочу использовать случайную строку из file1 вместо фиксированная строка, то я застрял. Я не знаю, как вставить код awk, который получает случайную строку, в код, который редактирует файл2 (или эквивалентный подход, который выполняет ту же работу).
file1:
string1_^%"$"£xxXF%
string2-$^^!dV"$&"}
string3~£""!&vhTT[@
string4_%^c!}[&(SR#
string5_$%&<[*^"!"H
string6_$$£<[*~)!£H
file2:
@ data1 line1, unique text follows
data1 line2, unique text follows
@ data2 line1, unique text follows
data2 line2, unique text follows
@ data3 line1, unique text follows
data3 line2, unique text follows
@ data4 line1, unique text follows
data4 line2, unique text follows
Желаемый вывод:
outfile:
$ data1 line1, unique text follows
data1 line2, unique text follows
fixed_text_inserted
string2-$^^!dV"$&"}
$ data2 line1, unique text follows
data2 line2, unique text follows
fixed_text_inserted
string6_$$£<[*~)!£H
$ data3 line1, unique text follows
data3 line2, unique text follows
fixed_text_inserted
string3~£""!&vhTT[@
$ data4 line1, unique text follows
data4 line2, unique text follows
fixed_text_inserted
string6_$$£<[*~)!£H
fixed_text_inserted всегда одинаков, только строка (без пробелов и табуляции)
Последняя (т.е. 4-я) строка каждой записи - это случайная строка из файла file1 (эти строки содержат специальные символы, например, $ £% "'% ^, и текст, но без пробелов и табуляций).
Случайный выбор с заменой, как в моем примере outfile, где string6 _ $$ £ <[* ~)! £ H} был выбран несколько раз. </p>
У меня около 400 файлов2 и каждый из них большой (~ 1 ГБ), и поэтому мне легко написать слишком медленный сценарий, но у меня возникла проблема с реализацией его с помощью awk.
Вот идея двух команд awk что каждый делает почти половину того, что я хочу:
Сначала получает случайную строку из файла1:
awk 'BEGIN{srand();} {a[NR]=$0} END{for(i=1; i<=5000; i++){x=int(rand()*NR) + 1}}' file 1
Затем используйте эту случайную строку при создании нового файла (outfile) из file2:
awk 'BEGIN {getline rlines; RS = "#" ; FS = "\n"} NR > 1 {print $1"\n"$2"\n"; printf rlines[NR]; printf "\n"}' file2 > outfile
Я сомневаюсь, что объединение этих двух строк - способ сделать это ; эти строки awk предназначены только для того, чтобы дать представление (я надеюсь) о том, что я пытаюсь сделать.
Я публикую это не только потому, что застрял, но и потому, что проблема касается общей проблемы c. как работать с несколькими файлами в awk и как определять сложные переменные в них. Есть примеры в сети, но они рассматривают эти вещи отдельно.
Спасибо всем, у кого есть какие-либо предложения, у меня еще не было ощущения "awk мышления".