如果列与另一个文件匹配,则打印匹配的每一行(awk/grep)

如果列与另一个文件匹配,则打印匹配的每一行(awk/grep)

我正在获取两个输入文件,一个包含某些 ID 号,另一个包含大量 ID 号和附加列。后一个文件包含每个 ID 号的多行,我需要从第一个文件中提取与 ID 匹配的所有行。然后必须将这些行打印在新文件中。

编辑 1:用实际的摘录替换示例文件

编辑 2:删除了摘录中的多余空格,但不是实际文件。文件可能需要以某种方式进行清理,但具体如何清理尚不清楚。

文件1:

AT1G56430
AT3G55190
AT3G22880

文件2:

AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

预期产出

AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

[ 文件1ss[文件2ss

我努力了:

awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2 > output.txt

和:

grep -Ff file2 file1 > output.txt

我知道这些论坛和其他论坛上发布了许多有些类似的问题。然而,这些没有提到如何处理输出......也没有提到重复。我已经尝试了其中 4 个解决方案,已经搞乱了好几个小时,并且不断遇到同样的问题:一个空白的输出文件。

我是 awk 的新手,非常感谢您的帮助。抱歉,如果这是语法等方面的简单问题;请告诉我。谢谢您的帮助。

答案1

您的 AWK 脚本即将完成:

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1] > 0' file1 file2 > output.txt

将行结尾从 Mac 更改为 Unix 后即可工作:

tr '\r' '\n' < file1 > file1.new
mv file1.new file1
tr '\r' '\n' < file2 > file2.new
mv file2.new file2

$1是AWK中的第一个字段。

相反c[$1] > 0,你可以写c[$1].不需要> 0:任何非零值都可以,所以我们不妨c直接使用以下内容:

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1]' file1 file2 > output.txt

答案2

尝试一下这个 awk 命令。

bash-4.1$ cat file1
1
3

bash-4.1$ cat file2
1|A|B
1|C|D
2|E|F
3|G|H

bash-4.1$ awk -F\| 'NR==FNR{F1[$0];next}$1 in F1{print}' file1 file2
1|A|B
1|C|D
3|G|H

答案3

join已经尝试过了吗?

$ tail -n +1 -- file1 file2
==> file1 <==
AT1G56430
AT3G55190
AT3G22880

==> file2 <==
AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

$ join -t'|' file1 file2
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

相关内容