1

我想使用前三列作为键将两个文件逐行合并为一个文件。例子:

文件1.txt

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

文件2.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

4 回答 4

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 
于 2013-03-14T10:27:39.583 回答
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
于 2013-03-12T17:12:24.690 回答
0

尝试这个:

 awk 'NR==FNR{a[$1$2$3]=$4;next}$1$2$3 in a{print $0, a[$1$2$3]}' file2 file1 
于 2013-03-12T16:36:23.817 回答
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 和排序输出中的不同列,请尝试:

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
于 2013-03-12T16:45:58.710 回答