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

Awk 合并文本文件的行并根据另一个文本文件中元素的顺序进行排序,awk,text-processing,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

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

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

您可以使用以下
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

您可以使用以下
awk
one行程序:

要创建临时数据,请执行以下操作:

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

您是否真的需要这个中间文件,或者您只是认为这是生成最终文件的必要方法?对于以a.txt中不存在的值(例如,
a3
)开头的B.txt中的行,您希望执行什么操作?或者,这种情况永远不会发生?在…处找到第一部分的代码。。。。awk's!=$1 | | NR==1{s=$1;if(p){print p};p=$0;next}{sub($1,“,$0);p=p”“$0;}END{print p}B.txt@Ed Morton:不,这是不必要的。我只是想一步一步地解释。不要认为你在任何网站或论坛上找到的awk代码都是合理的,包括这一个,除非你从新闻组comp.lang.awk那里得到它,在那里所有的awk专家都会对它进行审查。你发布的那个片段是不合理的。你真的需要那个中间文件吗?还是你只是认为这是生成最终文件的必要方法?对于以a.txt中不存在的值(例如,
a3
)开头的B.txt中的行,您希望执行什么操作?或者,这种情况永远不会发生?在…处找到第一部分的代码。。。。awk's!=$1 | | NR==1{s=$1;if(p){print p};p=$0;next}{sub($1,“,$0);p=p”“$0;}END{print p}B.txt@Ed Morton:不,这是不必要的。我只是想一步一步地解释。不要认为你在任何网站或论坛上找到的awk代码都是合理的,包括这一个,除非你从新闻组comp.lang.awk那里得到它,在那里所有的awk专家都会对它进行审查。您发布的代码片段不合理。请注意,如果
$1
值的计算结果为数字零,它将无法填充
a[]
。请注意,如果
$1
值的计算结果为数字零,它将无法填充
a[]
。请注意,如果
$1
值的计算结果为数字零,它将无法填充到a[]。并且处理此问题,我也为您提供了一个。我们两人都没有处理过的一个特殊情况是,B.txt中的
$1
从未出现在a.txt中,但OP没有告诉我们是否应该/如何处理。是的,我想删除数组条目并处理
END
块中的条目,但不想使其过于复杂<代码>:)好的,我也会这么做。a+1处理。谢谢,我也向你扔了一个。我们两人都没有处理过的一个特殊情况是,B.txt中的
$1
从未出现在a.txt中,但OP没有告诉我们是否应该/如何处理。是的,我想删除数组条目并处理
END
块中的条目,但不想使其过于复杂<代码>:)对,我也会这么做。