Как работает этот скрипт AWK?

0

У меня есть 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

Я хочу знать, как эта командная строка работает на этом примере, чтобы дать вывод?

Pragyant Prada Behera
источник
Есть слишком много возможных ответов, или хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или выделить проблему, на которую можно ответить в нескольких параграфах.
IconDaemon
1
Вы ищете решение для выполнения вашей задачи (объединение двух файлов с одним столбцом в файл с двумя столбцами), вы ищете объяснение того, что делает скрипт awk, или что-то еще? Пожалуйста, будьте конкретны, а также предоставьте образцы как входных файлов, так и ожидаемого вывода (и / или, возможно, откуда идет скрипт awk).
nohillside
извините за неудобства. Я изучаю сценарий оболочки. Я просто спрашиваю, как работает моя письменная команда? Мне нужно объяснение, как эта командная строка
Pragyant Prada Behera
Это довольно «интересный» способ решения проблемы. Вы получили это от unix.com/shell-programming-and-scripting/… ? Использование paste file1.text file2.textбудет казаться более простым в использовании и понимании :-)
nohillside

Ответы:

1

Что ж, часть обучения использованию Unix - выяснить, что делают существующие скрипты. В этом случае вам нужно немного узнать о том, как awkработает код. Я сосредоточусь на описании этой awkчасти, это должно помочь вам разобраться с остальными.

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

В вашем примере у вас есть три строки шаблона / кода:

NR==FNR {a[i++]=$0};

NRи FNRдве специальные переменные, установленные awk. Вы можете посмотреть их значение, man awkчтобы увидеть, что

NR     ordinal number of the current record
FNR    ordinal number of the current record in the current file

поэтому в основном это условие истинно, в то время как строки из первой строки считываются (что означает, что a[i++]=$0выполняется один раз для каждой строки из первого файла) и ложно для всех дополнительных файлов. $0текущая строка ввода.

        {b[x++]=$0;};{k=x-i};

Этот блок кода не имеет условия / шаблона, поэтому он выполняется для каждой прочитанной строки (из всех файлов, включая первый).

END     {for(j=0;j<i;) print a[j++],b[k++]}' 

Эта часть выполняется после того, как последняя строка последнего файла была прочитана и обработана.

С этими основами вы сможете сами понять значение различных блоков кода и переменных.

Nohillside
источник
Можете ли вы определить а и б?
Pragyant Prada Behera
aи bявляются переменными пользовательских массивов ( awkпеременные не нужно объявлять, они просто создаются с их использованием). Если это ваш первый контакт с, awkя рекомендую прочитать одну из многих доступных страниц введения. Это поможет вам быстрее, чем я могу объяснить здесь.
nohillside