比较awk中的两个柱
我正在尝试匹配两个表中的第一列。在下面的示例中,我需要在第二个表中获取到期日期,并使用'AWK'输出它 我尝试了下面的代码,但它不工作比较awk中的两个柱,awk,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
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
尝试:
原问题的答案
尝试:
工作原理:
将输入的字段分隔符设置为逗号-F,
对于第一个文件,NR==FNR{a[$1]=0;next;}
,收集关联数组中的所有数据,table1
,其中每一行,a
,都保存在其第一个字段的eky下,$0
$1
在读取第二个文件打印[$1],$2
时,打印表table2
中与第一个字段相对应的行,该字段后跟过期日期
$2`
将输出字段分隔符设置为逗号OFS=,
awk-F,'FILENAME==“table1”{arr[$1]=$0};FILENAME==“table2”{print arr[$1],$2}'OFS=,table1 table2
如果与示例数据一样,您的文件恰好具有相同顺序的相同键值,您可以使用粘贴和剪切:
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
指定连接时要使用的分隔符。默认值为选项卡
- 使用
-f
选项的cut
将列数据作为输入,由-d
选项中指定的字符分隔(默认情况下也是选项卡
),并打印-f
之后指定的列
谢谢,它很管用!,非常感谢您的详细解释。嗨,有一个问题,如果在表2中没有找到到期日,该命令将删除该行,如何解决此问题?@impitin第1步将在您发布的示例输入/输出中包含该情况,并在问题中描述您希望如何处理它。@EdMorton,嗨,使用许可的其他数据更新了表1,许可未过期,因此不在表2中,。在输出中,如果表3中不存在“N/A”,我想将“N/A”置于到期状态,谢谢you@impitnin请参阅更新后的答案以了解缺少到期日的处理。由于所需的输出基本上是table1,每行都附加了table2中的列,因此您需要先阅读table2以构建查找表,然后再阅读table1。换句话说,您读取文件的顺序是错误的。您好,有一个问题,该命令是删除行,如果在表2中未找到过期项,如何解决?
$ 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
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