)。需要你的帮助。我有两个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
答案 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
总结规则:
如果第一个文件中的应用程序是NotAvailable,则无论第二个文件中的内容是什么,其最终状态都是NotAvailable。
如果第一个文件中有应用程序,则其最终状态为第二个文件中的状态。
以下代码实现了这些规则:
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
结束看看会发生什么;然后,您将在此之后轻松地将输出传递到您自己的awk
或sed
命令(并在查看man join
之后调整连接的行为)。
最好的问候。