我正在获取两个输入文件,一个包含某些 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
[ [
我努力了:
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