打印第一个字段在文件中恰好出现两次的行

时间:2015-03-09 16:31:01

标签: bash awk

我有一个这样的文件:

91052011868;Export Equi_Fort Postal;EXPORT;23/02/2015;1;0;0
91052011868;Sof_equi_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;19/02/2015;1;0;0
91052011868;Sof_trav_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;19/02/2015;1;0;0
91052151371;Export Trav_faible temoin;EXPORT;12/02/2015;1;0;0
91052182019;Export Deme_fort temoin;EXPORT;24/02/2015;1;0;0
91052199517;Sof_voya_Faible_Email_pm;EMAIL;22/01/2015;1;0;0
91052199517;Sof_voya_Faible_Email_Relance_pm;EMAIL;26/01/2015;1;0;0
91052262558;Sof_deme_faible_Email_am;EMAIL;26/01/2015;1;0;1
91052265940;Sof_trav_Faible_Email_am_%yyyy%%mm%%dd%;EMAIL;13/02/2015;1;0;0
91052265940;Sof_trav_Faible_Email_Relance_am_%yyyy%%mm%%dd%;EMAIL;17/02/2015;1;0;0
91052265940;Sof_voya_Faible_Email_am_%yyyy%%mm%%dd%;EMAIL;13/02/2015;1;0;0
91052265940;Sof_voya_Faible_Email_Relance_am_%yyyy%%mm%%dd%;EMAIL;16/02/2015;1;0;0
91052531428;Export Trav_faible temoin;EXPORT;11/02/2015;1;0;0
91052547697;Export Deme_Faible Postal;EXPORT;27/02/2015;1;0;0
91052562398;Export Deme_faible temoin;EXPORT;18/02/2015;1;0;0

我想知道第一列重复值大于1但严重低于3的所有行。

91052199517;Sof_voya_Faible_Email_pm;EMAIL;22/01/2015;1;0;0
91052199517;Sof_voya_Faible_Email_Relance_pm;EMAIL;26/01/2015;1;0;0

我做了以下部分,但它不起作用......

 sort file | awk 'NR==FNR{a[$1]++;next;}{ if (a[$1] > 0 && a[$1] <1 )print $0;}' file file 

为什么?

1 个答案:

答案 0 :(得分:2)

如果你想要的是打印第一个字段出现两次的所有行,你可以使用它:

$ awk -F";" 'FNR==NR{a[$1]++; next} a[$1]==2' file file
91052199517;Sof_voya_Faible_Email_pm;EMAIL;22/01/2015;1;0;0
91052199517;Sof_voya_Faible_Email_Relance_pm;EMAIL;26/01/2015;1;0;0

这会将字段分隔符设置为分号,然后两次读取文件: - 第一次计算第一个字段出现的数量(a[$1]++) - 第二次打印匹配条件a[$1]==2的那些行。也就是说,第一个字段在整个文件中出现两次。

如果您希望这些索引出现2到4次,您可以在第二个块上使用以下语法:

a[$1]>=2 && a[$1]<=4

为什么你的方法不起作用?

因为你的病情说:

if (a[$1] > 0 && a[$1] <1 )

当然永远不会发生,因为a[$1]是一个整数,没有整数大于0且小于1。

请注意,我提出的解决方案使用相同的想法,只是采用更惯用的方式:在if条件下无需明确,也没有说print $0:这正是{ {1}}当条件评估为True时执行。