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

Mic*_*gle 6 grep awk

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

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

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

文件 1:

AT1G56430
AT3G55190
AT3G22880
Run Code Online (Sandbox Code Playgroud)

文件2:

AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI
Run Code Online (Sandbox Code Playgroud)

预期产出

AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI
Run Code Online (Sandbox Code Playgroud)

[文件1ss[文件 2ss

我试过了:

awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2 > output.txt
Run Code Online (Sandbox Code Playgroud)

和:

grep -Ff file2 file1 > output.txt
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*itt 5

你的 AWK 脚本就快到了:

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1] > 0' file1 file2 > output.txt
Run Code Online (Sandbox Code Playgroud)

在将行尾从 Mac 更改为 Unix 后,工作正常:

tr '\r' '\n' < file1 > file1.new
mv file1.new file1
tr '\r' '\n' < file2 > file2.new
mv file2.new file2
Run Code Online (Sandbox Code Playgroud)

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

取而代之的是c[$1] > 0,您可以编写c[$1]. 在> 0不需要:任何非零值的作品,所以我们还不如用的内容c直接:

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1]' file1 file2 > output.txt
Run Code Online (Sandbox Code Playgroud)