比较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'输出它

我尝试了下面的代码,但它不工作

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
    ,其中每一行,
    $0
    ,都保存在其第一个字段的eky下,
    $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