根据另一个文件的输入在第一个字段中搜索字符串,并将结果传递给新文件

时间:2015-02-09 15:50:01

标签: linux awk sed field piping

我有一个输入文件,如下所示

 Model related text
 Model specifications
 *ELEMENT_SHELL
 $#   eid     pid   n1   n2   n3   n4   n5   n6      n7    n8
 76737    1    79322  79323   79324   79511     0       0       0       0
 76738    1   79510   79203   79204   79512     0       0       0       0
 76739    1   79511   79324   79325   79513     0       0       0       0
 76740    1   79512   79204   79205   79514     0       0       0       0
 76741    1   79514   79205   79206   79515     0       0       0       0
 76742    1   79515   79206   79207   79516     0       0       0       0
 76743    1   79516   79207   79208   79517     0       0       0       0
 76744    1   79517   79208   79209   79518     0       0       0       0
 76745    1   79518   79209   79210   79519     0       0       0       0
 76746    1   79519   79210   79211   79520     0       0       0       0

在另一个档案文件2中,我只有像

这样的数字
 76737    
 76738    
 76739    
 76740    
 76741

我必须将File2.txt中的每个数字与File1.txt第一行中的数字进行比较,如果匹配,则将File1.txt中的完整行输出到model.txt 输出将是

 Model related text
 Model specifications
 *ELEMENT_SHELL
 $#   eid     pid   n1   n2   n3   n4   n5   n6      n7    n8
 76737    1    79322  79323   79324   79511     0       0       0       0
 76738    1   79510   79203   79204   79512     0       0       0       0
 76739    1   79511   79324   79325   79513     0       0       0       0
 76740    1   79512   79204   79205   79514     0       0       0       0
 76741    1   79514   79205   79206   79515     0       0       0       0

有人可以建议我使用AWK,SED等吗?

1 个答案:

答案 0 :(得分:3)

使用awk

可以轻松完成此操作
awk 'FNR==NR{ value[$1]; next} $1 in value || FNR < 5' 

<强>测试

$ awk 'FNR==NR{ value[$1]; next} $1 in value || FNR < 5' file2 file1
Model related text
Model specifications
*ELEMENT_SHELL
$#   eid     pid   n1   n2   n3   n4   n5   n6      n7    n8
76737    1    79322  79323   79324   79511     0       0       0       0
76738    1   79510   79203   79204   79512     0       0       0       0
76739    1   79511   79324   79325   79513     0       0       0       0
76740    1   79512   79204   79205   79514     0       0       0       0
76741    1   79514   79205   79206   79515     0       0       0       0

如果您对输出中的前导标题不感兴趣,则可以将脚本进一步简化为

awk 'FNR==NR{ value[$1]; next} $1 in value' file2 file1
76737    1    79322  79323   79324   79511     0       0       0       0
76738    1   79510   79203   79204   79512     0       0       0       0
76739    1   79511   79324   79325   79513     0       0       0       0
76740    1   79512   79204   79205   79514     0       0       0       0
76741    1   79514   79205   79206   79515     0       0       0       0

它的作用是什么?

  • FNR==NR检查从当前文件读取的记录数是否等于读取的记录总数。基本上,这仅针对第一个文件进行评估,即file2

  • value[$1]; next创建一个由$1索引的关联数组,file2

  • 中的值
  • $1 in value检查关联数组中是否存在第1列


修改

仅打印第一次出现。

打印完行后,您可以使用delete从关联数组中删除条目。这样可确保在第二次出现时不打印该行。

awk 'FNR==NR{ value[$1]; next} $1 in value{ print; delete value[$1] }'