AWK - 从两个文件中读取列

时间:2015-03-28 04:51:02

标签: awk

)。需要你的帮助。我有两个shell脚本,它产生如下输出

脚本1输出(abc.txt) - >

application_name      Status
abc                   Available
def                   NotAvailable
xyz                   Available

脚本2输出(def.txt) - >

application_name      Status
abc                   NotAvailable
def                   Available
xyz                   Available

正如您所看到的,两个文件中的应用程序名称是相同的顺序但状态不同,例如在一个文件中,应用程序abc的状态是可用的,而在另一个文件中,它不可用。我必须编写一个awk脚本来输出第三个文件,其中包含每个应用程序的最终状态。例如如果文件abc.txt中的应用程序abc的状态为“available”,并且文件def.txt中的状态为NotAvailable,则应用程序的状态应为“NotAvailable”..请在下面找到示例输出文件 -

Final_output文件(xyx.txt)

application_name     status
abc                  NotAvailable
def                  NotAvailable
xyz                  Available (since the status of this application is "available" in both the input file).

我尝试使用以下命令执行此操作,但它无法正常工作。它提供了错误的输出

awk 'NR==FNR {f1[$1]=$0; next} $1 in f1 && $0 != f1[$1] || $0 == f1[$1]' abc.txt def.txt

3 个答案:

答案 0 :(得分:1)

总之,只有在两个文件中都可用时,应用程序才是Available。在那种情况下:

$ awk 'NR==FNR {if ($2=="NotAvailable")f1[$1]=$0; next} $1 in f1 {print f1[$1];next} 1' abc.txt def.txt
application_name      Status
abc                   NotAvailable
def                   NotAvailable
xyz                   Available

如何运作

总结规则:

  1. 如果第一个文件中的应用程序是NotAvailable,则无论第二个文件中的内容是什么,其最终状态都是NotAvailable。

  2. 如果第一个文件中有应用程序,则其最终状态为第二个文件中的状态。

  3. 以下代码实现了这些规则:

    • NR==FNR {if ($2=="NotAvailable")f1[$1]=$0; next}

      在浏览第一个文件时,保存所有NotAvailable应用程序的状态。

    • $1 in f1 {print f1[$1];next}

      如果第一个文件中的应用程序是NotAvailable,请从第一个文件(NotAvailable)打印其状态。

    • 1

      否则,从第二个文件打印状态。 (1是用于打印当前行的awk的神秘缩写。)

答案 1 :(得分:1)

$ awk 'NR==FNR{s[$1]=$0;next} $2=="Available"{$0=s[$1]} 1' file1 file2
application_name      Status
abc                   NotAvailable
def                   NotAvailable
xyz                   Available

答案 2 :(得分:0)

之前的答案很好,我不会在awk上加上我的两分钱。但是为了坚持Unix哲学,你可能会被join工具所左右。它将预先安装在任何Linux发行版上;只需输入:

join f1.txt f2.txt

结束看看会发生什么;然后,您将在此之后轻松地将输出传递到您自己的awksed命令(并在查看man join之后调整连接的行为)。

最好的问候。