我有两个txt文件(制表符分隔)我试图与awk进行比较。我想将file1的第1列与file2的第5列进行比较,并且任何时候file1第1列的字符串与file2第5列匹配我想要打印(最终到新的txt文件)整行file2。文件1中大约有14000行,只有一列,40000行,文件2中有6列。下面是我用来试图弄清楚如何使用awk获取所需输出的一些测试文件。
文件1
AAGAB
AAK1
AAMDC
AAMP
AAR2
AARD
AARS
file2的
chr22 38035683 38052050 NM_018957 AAMDC +
chrX 47001614 47004609 NM_019056 AAMP -
chr9 21994789 22077889 NR_047539 AAR2 +
chr16 20370491 20416033 NM_174924 AARD -
chr1 210111518 210337633 NM_001146262 AARS +
chrX 30233674 30238206 NM_002364 MAGEB2 +
chrX 30261847 30270155 NM_002363 MAGEB1 +
我已尝试采用其他类似awk问题的类似所需输出的其他awk问题:
awk -F '\t' 'NR==FNR{c[$1]++;next}c[$5]' file1 file2
但是我只为AARS行获得一个匹配项,即使测试文件中还有其他匹配项:
chr1 210111518 210337633 NM_001146262 AARS +
我正在寻找的输出是:
chr14 94463615 94473898 NR_024182 AAGAB +
chr10 74033676 74035797 NM_019058 AAK1 +
chr22 38035683 38052050 NM_018957 AAMDC +
chrX 47001614 47004609 NM_019056 AAMP -
chr9 21994789 22077889 NR_047539 AAR2 +
chr16 20370491 20416033 NM_174924 AARD -
chr1 210111518 210337633 NM_001146262 AARS +
我已尝试在stackoverflow上使用其他几个帖子,但即使存在多个其他匹配项,仍然只获得1个匹配的相同输出:
awk to match file1 with file2 and output matches
awk -F '\t' 'NR==FNR{c[$1]; next} ($5 in c)' file1 file2
Find rows with the same value in a column in two files
awk -F '\t' 'NR==FNR{A[$1];next}$5 in A' file1 file2
Comparing two columns in two files using awk
awk -F '\t' 'FNR==NR {a[$1];next} {for (i in a) if ($5~i) print}' file1 file2
有人可以帮我理解我的awk系列出错的地方吗?
我目前正在使用GNU Awk 4.2.1,API:2.0
答案 0 :(得分:0)
我觉得你差不多了......我确实检查了 - 以下内容适用于我。
awk -F '\t' 'BEGIN { split("", a) } NR == FNR { a[$0] = 1; next } $5 in a' file1 file2
结果(示例中的输出与file2不一致):
chr22 38035683 38052050 NM_018957 AAMDC +
chrX 47001614 47004609 NM_019056 AAMP -
chr9 21994789 22077889 NR_047539 AAR2 +
chr16 20370491 20416033 NM_174924 AARD -
chr1 210111518 210337633 NM_001146262 AARS +
FS有可能出现问题,我想......你可以尝试在空间和标签上点击FS。还试图从混乱中删除任何不可见和不可打印的字符?
awk -F '[[:blank:]]+' '
BEGIN { split("", a) }
NR == FNR {
gsub(/[^[:graph:]]/, "")
a[$0] = 1
next
}
{
p = $5
gsub(/[^[:graph:]]/, "", p)
}
p in a' file1 file2
答案 1 :(得分:0)
从file1
读入一个关联数组。然后阅读file2
,并为每一行寻找匹配项。
$ awk 'BEGIN{while(getline line<"file1") {x[line]="1";}} {for (i=1;i<=NF;i++) if(x[$i]) {print; break} }' file2
chr22 38035683 38052050 NM_018957 AAMDC +
chrX 47001614 47004609 NM_019056 AAMP -
chr9 21994789 22077889 NR_047539 AAR2 +
chr16 20370491 20416033 NM_174924 AARD -
chr1 210111518 210337633 NM_001146262 AARS +