使用来自另一个文件的列表过滤文件,基于子串

时间:2017-07-24 19:46:58

标签: shell unix filter

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

1 个答案:

答案 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