У меня есть 2 файла данных, каждый из которых содержит один столбец. Я хочу создать другой файл данных, объединив оба столбца. У меня есть командная строка в оболочке, но я не знаю, как она работает.
Пожалуйста, объясните подробно следующую команду:
awk 'NR==FNR {a[i++]=$0};
{b[x++]=$0;};{k=x-i};
END {for(j=0;j<i;) print a[j++],b[k++]}' \
file1.txt file2.txt
Пример:
вход:
file1.txt
11
23
19
31
67
file2.txt
13
19
25
67
93
Я использовал команду выше для написания сценария оболочки и получил следующий вывод:
11 13
23 19
19 25
31 67
67 93
Я хочу знать, как эта командная строка работает на этом примере, чтобы дать вывод?
command-line
unix
Pragyant Prada Behera
источник
источник
paste file1.text file2.text
будет казаться более простым в использовании и понимании :-)Ответы:
Что ж, часть обучения использованию Unix - выяснить, что делают существующие скрипты. В этом случае вам нужно немного узнать о том, как
awk
работает код. Я сосредоточусь на описании этойawk
части, это должно помочь вам разобраться с остальными.По сути
awk
, это язык сценариев на основе шаблонов, где команды состоят из шаблона (условия поиска) и соответствующего блока кода. Во время выполнения любые входные файлы читаются построчно, и если шаблон / условие истинно для строки, выполняется кодовый блок. Есть специальные моделиBEGIN
иEND
которые используются для запуска кода , чтобы выполняться до того первой линии или после того, как последняя строка читается.В вашем примере у вас есть три строки шаблона / кода:
NR
иFNR
две специальные переменные, установленныеawk
. Вы можете посмотреть их значение,man awk
чтобы увидеть, чтопоэтому в основном это условие истинно, в то время как строки из первой строки считываются (что означает, что
a[i++]=$0
выполняется один раз для каждой строки из первого файла) и ложно для всех дополнительных файлов.$0
текущая строка ввода.Этот блок кода не имеет условия / шаблона, поэтому он выполняется для каждой прочитанной строки (из всех файлов, включая первый).
Эта часть выполняется после того, как последняя строка последнего файла была прочитана и обработана.
С этими основами вы сможете сами понять значение различных блоков кода и переменных.
источник
a
иb
являются переменными пользовательских массивов (awk
переменные не нужно объявлять, они просто создаются с их использованием). Если это ваш первый контакт с,awk
я рекомендую прочитать одну из многих доступных страниц введения. Это поможет вам быстрее, чем я могу объяснить здесь.