Сравните два столбца в awk - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь сопоставить первый столбец в двух таблицах. В приведенном ниже примере мне нужно получить дату истечения срока действия во второй таблице и вывести ее с помощью `AWK.

Я попробовал приведенный ниже код, но он не работает

awk 'NR==FNR{a[$1]=$2;next;}{print $0 "," ($1 in a ? a[$1] : $2 )}' table1 table2

Table1

LICENSE,ALLOCATION,IN_USE
LicenseA,1102,98
LicenseB,267,105
LicenseC,546,500
LicenseD,982,23

Table2

LICENSE,EXPIRY
LicenseA,03/31/2019
LicenseB,03/25/2019
LicenseC,03/31/2019

Желаемый вывод:

LICENSE,ALLOCATION,IN_USE,EXPIRY
LicenseA,1102,98,03/31/2019
LicenseB,267,105,03/25/2019
LicenseC,546,500,03/31/2019
LicenseD,982,23,N/A

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Попробуйте:

$ awk -F, 'NR==FNR{a[$1]=$2;next;}{print $0,a[$1]?a[$1]:"N/A"}' OFS=, Table2 Table1
LICENSE,ALLOCATION,IN_USE,EXPIRY
LicenseA,1102,98,03/31/2019
LicenseB,267,105,03/25/2019
LicenseC,546,500,03/31/2019
LicenseD,982,23,N/A

Ответ на оригинальный вопрос

Попробуйте:

$ awk -F, 'NR==FNR{a[$1]=$0;next;}{print a[$1],$2}' OFS=, table1 table2
LICENSE,ALLOCATION,IN_USE,EXPIRY
LicenseA,1102,98,03/31/2019
LicenseB,267,105,03/25/2019
LicenseC,546,500,03/31/2019

Как это работает:

  • -F,

    Установить разделитель полей на входе запятой.

  • NR==FNR{a[$1]=$0;next;}

    Для первого файла, table1, собрать все его данные в ассоциативный массив, a, в котором каждая строка, $0, сохраняется под знаком своего первого поля, $1.

  • print a[$1],$2

    При чтении второго файла table2 выведите строку из таблицы that corresponds to the first field followed by the expiry, $ 2`.

  • OFS=,

    Установите разделитель поля вывода на запятую.

0 голосов
/ 13 апреля 2019

Если, как и ваши примерные данные, ваши файлы имеют одинаковые значения ключей в одном и том же порядке, вы можете использовать paste и cut вместо:

njv@pandion:~$ paste -d, Table1 Table2|cut -f1,2,3,5 -d,
LICENSE,ALLOCATION,IN_USE,EXPIRY
LicenseA,1102,98,03/31/2019
LicenseB,267,105,03/25/2019
LicenseC,546,500,03/31/2019
  • paste принимает два или более файлов в качестве аргументов и печатает конкатенацию первой строки каждого файла с последующим конкатенацией второй строки каждого файла и т. Д.
  • -d указывает разделитель для использования при конкатенации. По умолчанию tab.
  • cut с параметром -f принимает в качестве входных данных столбчатые данные, разделенные символом, указанным в параметре -d (также tab по умолчанию), и печатает столбцы, указанные после -f.
0 голосов
/ 13 апреля 2019

Очень похожий подход к хорошо объясненному ответу Джона, но с использованием имен файлов для сопоставления с образцом вместо определения файла по номерам строк и следующим.

awk -F, 'FILENAME == "table1" {arr[$1] = $0}; FILENAME == "table2" {print arr[$1],$2}' OFS=, table1 table2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...