使用awk或linux命令基于密钥合并多个文件中的行

使用awk或linux命令基于密钥合并多个文件中的行,awk,union,Awk,Union,我在目录中有'n'个文件。例如,有3个文件,如下所示 file1.txt "aba" 0 0 "aba" 0 0 1 "abc" 0 1 "abd" 1 1 "xxx" 0 0 file2.txt "xyz" 0 0 "aba" 0 0 0 0 "aba" 0 0 0 1 "xxx" 0 0 "abc" 1 1 file3.txt "xyx" 0 0 "aba" 0 0 "aba" 0 1 0 "xxx" 0 0 0 1 "abc" 1 1 我想使用列1和列2作为键列打印所有3个文件

我在目录中有'n'个文件。例如,有3个文件,如下所示

file1.txt

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

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

"xyx" 0 0
"aba" 0 0 
"aba" 0 1 0
"xxx" 0 0 0 1
"abc" 1 1
我想使用列1和列2作为键列打印所有3个文件中的行的并集。对于union中的每一行打印所有原始列,打印次数(文件数)键出现在第一列,频率键出现在第二列。示例输出如下所示:

1  1/3  "abc" 0 1
1  1/3  "abd" 1 1
1  1/3  "xyz" 0 0
2  2/3  "abc" 1 1
3  3/3  "aba" 0 0 
3  3/3  "aba" 0 0 1
3  3/3  "xxx" 0 0
1  1/3  "xyx" 0 0  
是否有人可以使用awk或linux命令对此进行帮助,并将其推广到目录中的n个文件

awk 'FNR==1{x++} {a[$1 FS $2][x]; b[$1 FS $2]=$0} END{for(i in a){q=0;for(j in a[i]){q++};print q,q"/"x,b[i]}}' file* 
输出:

1 1/3 "xyx" 0 0
1 1/3 "abc" 0 1
2 2/3 "abc" 1 1
3 3/3 "xxx" 0 0 0 1
1 1/3 "abd" 1 1 
1 1/3 "xyz" 0 0
3 3/3 "aba" 0 1 0
你可以按照你想要的方式来分类


注意:使用gawk版本>=4.0

您尝试了什么?我认为输出的规格不完整。如何确定输出中的列数?为什么“xxx”在输出中只有“0”?嗨,我是在R中做的,它变成了一个内存密集型的工作,需要更多的文件,而我没有awk或linux解决方案。列数是原始列数+前两个新列。在这种情况下,“xxx 0 0”出现在所有三个文件中,在这种情况下,它可以从第一次出现即从第一个文件开始打印。所以,它的列数不一定相等。谢谢!!你是说gawk版本>=4.0用于排序还是整个脚本。Bcoz当我使用您的代码时,它显示了一个错误:“源代码第1行上下文的语法错误是FNR==1{x++}{a[$1 FS>>>>$2][对于脚本,因为awk的旧版本不允许多维数组-
a[x][y]