比较awk中的两个列

时间:2019-04-13 01:30:52

标签: awk

我正在尝试匹配两个表中的第一列。在下面的示例中,我需要获取第二张表上的到期日期,并使用`AWK将其输出。

我尝试了以下代码,但无法正常工作

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

表1

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

表2

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 个答案:

答案 0 :(得分:1)

尝试:

$ 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=,

    将“输出字段分隔符”设置为逗号。

答案 1 :(得分:0)

与Johns非常相似的方法很好地解释了答案,但是使用文件名进行模式匹配,而不是通过行号和下一个来检测文件。

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

答案 2 :(得分:0)

如果像示例数据一样,您的文件碰巧具有相同的键值且顺序相同,则可以改用pastecut

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之后指定。