Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux AWK比较两个文件中的两列输出匹配行-匹配中缺少行_Linux_Bash_Awk - Fatal编程技术网

Linux 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 '

我有两个txt文件(制表符分隔),我试图与awk进行比较。我想将file1的第1列与file2的第5列进行比较,每当file1的第1列中的字符串与file2的第5列相匹配时,我想打印整个file2行(最终打印成一个新的txt文件)。文件1中大约有14000行,只有一列;文件2中有40000行,有6列。下面是我一直在使用的一些测试文件,它们试图找出如何使用awk来获得所需的输出

文件1

文件2

我试着采用其他一些类似的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线路哪里出了问题吗


我目前使用的是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    +