file1.txt
:
1234567890IDNUMBER1
1234567890IDNUMBER2
1234567890IDNUMBER3
1234567890IDNUMBER4
1234567890IDNUMBER5
注意:IDNUMBERX是固定长度的唯一ID。在这种特殊情况下,它长度为9个字符,始终位于第11位。
file2.txt
:
IDNUMBER1
IDNUMBER2
IDNUMBER4
注意:ID列表。
我想要做的是过滤第一个文件以删除第二个文件中未列出ID的所有行。
预期产出:
1234567890IDNUMBER1
1234567890IDNUMBER2
1234567890IDNUMBER4
我在这里发现了非常类似的问题: grep matching specific position in lines using words from other file
我在那里尝试了明确的答案,并且对我来说不像作者所描述的那样:
awk 'NR==FNR{a[$0]=1;next;} substr($0,11,9) in a' file2.txt file1.txt
只返回一行(最后匹配):
1234567890IDNUMBER4
来自链接问题的数据相同。
有什么不对?
使用:GNU Awk 4.1.4,API:1.1(GNU MPFR 3.1.5-p2,GNU MP 6.1.2)
修改
愚蠢的我...这一切都是关于在Windows上结束的行... Windows回车标志导致了问题。
我用过:
awk '{ sub("\r$", ""); print }' dos.txt > unix.txt
转换文件以删除回车。 Source
答案 0 :(得分:1)
尝试:
awk 'FNR==NR{a[substr($0,11)]=$0;next} ($1 in a){print a[$1]}' File1.txt File2.txt
1234567890IDNUMBER1
1234567890IDNUMBER2
1234567890IDNUMBER4
编辑:现在再添加一个解决方案。
awk 'FNR==NR{a[$2]=$0;next} ($1 in a){print a[$1]}' FIELDWIDTHS="10 9" File1.txt File2.txt