![如何根据第二个文件中的信息保留文件中的部分行?](https://linux22.com/image/95884/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E4%BF%A1%E6%81%AF%E4%BF%9D%E7%95%99%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E9%83%A8%E5%88%86%E8%A1%8C%EF%BC%9F.png)
我有一个数据文件,如下所示:
file1:
c1.212 3.4 90
c1.011 4.4 33
c2.09432 7.7 76
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c4.1211001 1.2 11
c4.1111222 1.2 10
c4.0000011 99 76
c5.123 11 01
c5.113 11 01
...
第二个文件如下所示:
c1.212
c3.2223
c3.0911
c5.113
...
正如您在文件 1 中看到的,根据第一列中的信息,有 5 个组(c1、c2、c3、c4 和 c5),每个组具有不同数量的子集(例如 c1 有 2 个子集,但 c2 有一个子集) ,但在第二个文件中有 3 个组(c1、c3 和 c5)。我想要的是,如果在 file2 中观察到的任何组及其所有子集保留在文件 1 中,而文件 2 中未观察到的那些组(c1 和 c4)则从 file1 及其所有子集中删除。因此输出应如下所示:
output:
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01
...
任何建议将不胜感激。(真实文件有超过 45,000 行)
答案1
使用join
加号uniq
join -t '.' -o 1.1,1.2 file1 file2 | uniq
这将“拆分”“.”上的每个文件。字符,并输出与第一个字段匹配的行。 “-o”选项告诉 join 仅输出 file1 中的前两个字段
我回答后您更改了问题,因此现在不起作用:)用于sed
预处理文件以替换第一个“。”带有选项卡或一些独特的字符
答案2
这是很好的awk
主食
awk -F. 'NR==FNR {a[$1]++; next} $1 in a' file2 file1
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01
或者,假设组标识符(c1
等c2
)没有出现在文件中的其他任何位置,您可以使用cut
提取标识符,然后grep
在第一个文件中匹配它们,例如
$ cut -d. -f1 file2 | grep -Fwf- file1
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01