根据另一个文件的输入在第一个字段中搜索文件并将结果传送到新文件

Searching file for a string in the first field depending on the input from another file and piping the result to new file

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

 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 等吗?

这可以使用 awk

轻松完成
awk 'FNR==NR{ value[]; next}  in value || FNR < 5' 

测试

$ awk 'FNR==NR{ value[]; next}  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

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

awk 'FNR==NR{ value[]; next}  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[]; next 创建一个由 </code> 索引的关联数组,值来自 <code>file2

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


编辑

只打印第一次出现的地方。

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

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