Python 在特定列中查找常用元素>;2个文件,并打印每个文件的相应行

Python 在特定列中查找常用元素>;2个文件,并打印每个文件的相应行,python,unix,awk,Python,Unix,Awk,我的问题是很久以前提出的问题的延伸。问题是在linux中匹配特定列中的条目后,在>2个文件中查找公共元素 问题是(我指的是这个帖子:) 我有三个文件,如下所示 file1.txt "aba" 0 0 1 "abc" 0 1 "abd" 1 1 "xxx" 0 0 "xyz" 0 0 "aba" 0 0 0 1 "xxx" 0 0 "abc&qu

我的问题是很久以前提出的问题的延伸。问题是在linux中匹配特定列中的条目后,在>2个文件中查找公共元素

问题是(我指的是这个帖子:)

我有三个文件,如下所示

file1.txt

"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0
"xyz" 0 0
"aba" 0 0 0 1
"xxx" 0 0
"abc" 1 1
"xyx" 0 0
"aba" 0 0 
"xxx" 0 0 0 1
"abc" 1 1
file2.txt

"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0
"xyz" 0 0
"aba" 0 0 0 1
"xxx" 0 0
"abc" 1 1
"xyx" 0 0
"aba" 0 0 
"xxx" 0 0 0 1
"abc" 1 1
file3.txt

"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0
"xyz" 0 0
"aba" 0 0 0 1
"xxx" 0 0
"abc" 1 1
"xyx" 0 0
"aba" 0 0 
"xxx" 0 0 0 1
"abc" 1 1
我想根据前两列在所有三个文件中找到相似的元素

现在,我不仅要从所有文件中找到相似的元素,还要从所有文件中打印相应的行。请注意,我的所有文件都没有排序

注意:我希望只从所有文件中匹配第1列中的元素,并按顺序打印文件中的相应行

因此,在本例中,我期望的输出是:

"xxx" 0 0 0 0 0 0 1
"aba" 0 0 1 0 0 0 1 0 0
"abc" 0 1 1 1 1 1 
它正在按顺序打印文件1-3中的匹配元素($1)

一位用户为此提供了以下解决方案:

awk '
    FNR == NR { 
        arr[$1,$2] = 1
        line[$1,$2] = line[$1,$2] ( line[$1,$2] ? SUBSEP : "" ) $0
        next
    }
    FNR == 1 { delete found }
    { if ( arr[$1,$2] && ! found[$1,$2] ) { arr[$1,$2]++; found[$1,$2] = 1 } }
    END { 
        num_files = ARGC -1 
        for ( key in arr ) {
            if ( arr[key] < num_files ) { continue }
            split( line[ key ], line_arr, SUBSEP )
            for ( i = 1; i <= length( line_arr ); i++ ) { 
                printf "%s\n", line_arr[ i ]
            } 
        } 
    }
' file1.txt file2.txt file3.txt
是否有方法修改此脚本,以便它打印所有文件中的匹配行。我需要以上面提到的格式并排显示这些行。我的文件是以制表符分隔的,所以我希望输出也是以制表符分隔的。另一个重要点是,所有文件都包含相同的列数,但行数不同。

给定:

$ head file?.txt
==> file1.txt <==
"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0

==> file2.txt <==
"xyz" 0 0
"aba" 0 0 0 1
"xxx" 0 0 0 1
"abc" 1 1

==> file3.txt <==
"xyx" 0 0
"aba" 0 1 0
"xxx" 0 0 0 1
"abc" 1 1
$ head file{1..3}.txt
==> file1.txt <==
"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0

==> file2.txt <==
"xyz" 0 0
"aba" 0 0 0 1
"xxx" 0 0 0 1
"abc" 1 1

==> file3.txt <==
"xyx" 0 0
"xxx" 0 0 0 1
"abc" 1 1
印刷品:

"aba"  0 0 1 0 0 0 1 0 1 0
"abc"  0 1 1 1 1 1
"xxx"  0 0 0 0 0 1 0 0 0 1
"abc"  0 1 1 1 1 1
"xxx"  0 0 0 0 0 1 0 0 0 1

来自评论

鉴于:

$ head file{1..3}.txt
==> file1.txt <==
"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0

==> file2.txt <==
"xyz" 0 0
"aba" 0 0 0 1
"xxx" 0 0 0 1
"abc" 1 1

==> file3.txt <==
"xyx" 0 0
"xxx" 0 0 0 1
"abc" 1 1
印刷品:

"aba"  0 0 1 0 0 0 1 0 1 0
"abc"  0 1 1 1 1 1
"xxx"  0 0 0 0 0 1 0 0 0 1
"abc"  0 1 1 1 1 1
"xxx"  0 0 0 0 0 1 0 0 0 1

aba是否意味着在预期结果中出现两次?实际上在我的文件中,元素是唯一的。在本例中,aba出现两次,因此可能会造成混淆。如果需要,可以假设我正在比较前两列,并且第1列中的元素都是唯一的。非常感谢。但是,在第二列中有重复项,但第一列优先。此外,我认为没有必要比较第2列中的元素。因为在我的文件中,第1列的值都是唯一的,所以我可以在所有文件中匹配它们,并显示包含公共元素的每个文件的行。所以abc不也应该出现吗?是的,如果我只匹配第一列,abc应该出现。在给定的示例中,它与前两列匹配,因此abc不会出现。我对匹配第1列感兴趣。我会在原帖中做必要的修改。嘿,谢谢你的回复。但是,当运行您的awk脚本时,我得到的是输出:0 1 0 1 0,1 1 1,0 0 0 1 0 0 0 0 0逗号用于行分隔符。由于某些原因,我无法在代码格式中格式化注释部分。您的文件来自Windows吗?我正在Windows机上工作,通过使用基于Linux的服务器MobaXterm@dawg啊,,所以这是一个问题,他们应该问一个新的后续问题。@EdMorton:没错