我有两个未分类的文本文件,如下所示,它们不一定具有相同的行数:
在A.txt中,每行只有一个唯一元素:
a7
a1
a5
a2
a6
a8
a4
在B.txt中,每行有一个唯一的元素对:
a1 a2
a7 a6
a1 a5
a5 a8
a1 a4
a2 a1
a4 a5
a6 a7
a8 a2
如果有多个对具有共同的第一个元素,我首先要以某种方式合并B.txt的行,第二个元素必须连接起来:
TempAB.txt
a1 a2 a5 a4
a7 a6
a5 a8
a2 a1
a4 a5
a6 a7
a8 a2
然后最终输出必须与A.txt的顺序相同,如:
AB.txt
a7 a6
a1 a2 a5 a4
a5 a8
a2 a1
a6 a7
a8 a2
a4 a5
使用awk的任何建议?
答案 0 :(得分:2)
您可以使用以下awk
单行:
创建临时数据:
awk '{a[$1] = (a[$1]?a[$1] FS $2:$2)}END{for(x in a) print x,a[x]}' b.txt
a1 a2 a5 a4
a2 a1
a4 a5
a5 a8
a6 a7
a7 a6
a8 a2
您可以将输出重定向到另一个文件b.tmp
。
要获得第二个输出,您可以执行以下操作:
awk 'NR==FNR{a[$1]=$0;next}{print (($1 in a) ? a[$1] : $1)}' b.tmp a.txt
a7 a6
a1 a2 a5 a4
a5 a8
a2 a1
a6 a7
a8 a2
a4 a5
如果你真的不需要中间文件,那么你可以绕过它,然后执行:
awk 'NR==FNR{a[$1]=(a[$1]?a[$1]FS$2:$0);next}{print(($1 in a)?a[$1]:$1)}' b.txt a.txt
a7 a6
a1 a2 a5 a4
a5 a8
a2 a1
a6 a7
a8 a2
a4 a5
答案 1 :(得分:2)
$ awk 'NR==FNR {a[$1]=($1 in a?a[$1] FS:"")$2; next} {print $1, a[$1]}' B.txt A.txt
a7 a6
a1 a2 a5 a4
a5 a8
a2 a1
a6 a7
a8 a2
a4 a5