我有一个输入文件,如下所示
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等吗?
答案 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] }'