根据另一个文件的输入在第一个字段中搜索文件并将结果传送到新文件
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[] }'
我有一个如下所示的输入文件
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[] }'