我正在尝试匹配两个表中的第一列。在下面的示例中,我需要获取第二张表上的到期日期,并使用`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
答案 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)
如果像示例数据一样,您的文件碰巧具有相同的键值且顺序相同,则可以改用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
之后指定。