Linux AWK比较两个文件中的两列输出匹配行-匹配中缺少行
我有两个txt文件(制表符分隔),我试图与awk进行比较。我想将file1的第1列与file2的第5列进行比较,每当file1的第1列中的字符串与file2的第5列相匹配时,我想打印整个file2行(最终打印成一个新的txt文件)。文件1中大约有14000行,只有一列;文件2中有40000行,有6列。下面是我一直在使用的一些测试文件,它们试图找出如何使用awk来获得所需的输出 文件1 文件2 我试着采用其他一些类似的awk问题,从大量类似的awk问题中获得类似的期望输出,因此:Linux AWK比较两个文件中的两列输出匹配行-匹配中缺少行,linux,bash,awk,Linux,Bash,Awk,我有两个txt文件(制表符分隔),我试图与awk进行比较。我想将file1的第1列与file2的第5列进行比较,每当file1的第1列中的字符串与file2的第5列相匹配时,我想打印整个file2行(最终打印成一个新的txt文件)。文件1中大约有14000行,只有一列;文件2中有40000行,有6列。下面是我一直在使用的一些测试文件,它们试图找出如何使用awk来获得所需的输出 文件1 文件2 我试着采用其他一些类似的awk问题,从大量类似的awk问题中获得类似的期望输出,因此: awk -F '
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线路哪里出了问题吗
我目前使用的是GNUAWK4.2.1,API:2.0,我想你几乎已经拥有了它。。。我确实检查过了——下面的内容对我很有用
awk -F '\t' 'BEGIN { split("", a) } NR == FNR { a[$0] = 1; next } $5 in a' file1 file2
结果(示例中的输出与文件2不一致):
我想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
从
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 +
$awk'开始{while(getline您的文件很可能有其他选项卡或选项卡空间组合改变了字段计数器。如果您的字段不包含空格字符,则无需指定字段分隔符。请运行相同的代码而不使用-F'\t'
运行而不使用-F'\t'产生相同的结果,但您的注释使我认为可能存在som。)文件本身有问题。我使用cat-v检查了其他选项卡/空格组合,发现在文件1的末尾,除了AAR之外,文件1中每行的末尾都有^M(因为我在excel中打开了该文件以另存为txt文件)。因此,我使用dos2unix删除^M awk,并按照您的建议删除了-F'\t',效果与预期一样。非常感谢,这让我抓狂!Whee,我喜欢当解决方案在一个漂亮的问题中完全没有提及时。:-)下一次,作为一种理智检查,试着像回答问题的人一样仔细检查你的问题——将你的示例输入从SO复制到temp文件,并在上面运行代码。
awk -F '\t' 'NR==FNR{A[$1];next}$5 in A' file1 file2
awk -F '\t' 'FNR==NR {a[$1];next} {for (i in a) if ($5~i) print}' file1 file2
awk -F '\t' 'BEGIN { split("", a) } NR == FNR { a[$0] = 1; next } $5 in a' file1 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 +
awk -F '[[:blank:]]+' '
BEGIN { split("", a) }
NR == FNR {
gsub(/[^[:graph:]]/, "")
a[$0] = 1
next
}
{
p = $5
gsub(/[^[:graph:]]/, "", p)
}
p in a' 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 +