合并文本文件的行并根据另一个文本文件中元素的顺序进行排序

时间:2014-08-22 17:16:57

标签: awk text-processing

我有两个未分类的文本文件,如下所示,它们不一定具有相同的行数:

在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的任何建议?

2 个答案:

答案 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