如何使用awk基于前三列合并两个文件

时间:2013-03-12 16:30:04

标签: awk

我希望将前两列作为键,将两个文件逐行合并为一个文件。例如:

FILE1.TXT

a b c 1 4 7
x y z 2 5 8
p q r 3 6 9

FILE2.TXT

p q r 11
a b c 12
x y z 13

我对上述两个文件的所需输出是:

a b c 1 4 7 12
x y z 2 5 8 13
p q r 3 6 9 11

每个文件中的列数不固定,可能因行而异。另外,我在每个文件中都有超过27K行。

他们没有订购。他们唯一的问题是两个文件的前三个字段是相同的。

4 个答案:

答案 0 :(得分:1)

您也可以使用join,它需要排序输入并且前3个字段已合并。下面的示例对每个文件进行排序,并让sed合并并分隔字段:

join <(sort file1.txt | sed 's/ /-/; s/ /-/') \
     <(sort file2.txt | sed 's/ /-/; s/ /-/') |
sed 's/-/ /; s/-/ /'

输出:

a b c 1 4 7 12
p q r 3 6 9 11
x y z 2 5 8 13

答案 1 :(得分:1)

加入前三个字段,其中字段数为(四个或更多)

{
    # get the forth field until the last
    for (i=4;i<=NF;i++)
        f=f$i" "

    # concat fields
    arr[$1OFS$2OFS$3]=arr[$1OFS$2OFS$3]f;
    # reset field string
    f=""    
}    
END {
    for (key in arr)
        print key, arr[key]    
}

运行如:

$ awk -f script.awk file1 file2
a b c 1 4 7 12 
p q r 3 6 9 11 
x y z 2 5 8 13 

答案 2 :(得分:0)

试试这个:

 awk 'NR==FNR{a[$1$2$3]=$4;next}$1$2$3 in a{print $0, a[$1$2$3]}' file2 file1 

答案 3 :(得分:0)

如果列的长度不同,您可以使用SUBSEP尝试类似的内容:

awk 'NR==FNR{A[$1,$2,$3]=$4; next}($1,$2,$3) in A{print $0, A[$1,$2,$3]}' file2 file1

对于file1和sort输出中的不同列,请尝试:

awk '{$1=$1; i=$1 FS $2 FS $3 FS; sub(i,x)} NR==FNR{A[i]=$0; next}i in A{print i $0, A[i]}' file2 file1 | sort