1

最初の 3 つの列をキーとして使用して、2 つのファイルを 1 行ずつ 1 つの行にマージしたいと考えていました。例:

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

上記の 2 つのファイルの望ましい出力は次のとおりです。

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

各ファイルの列数は固定されておらず、行ごとに異なる場合があります。また、各ファイルに 27,000 行以上ありました。

それらは注文されていません。唯一のことは、最初の 3 つのフィールドが両方のファイルで同じであることです。

4

4 に答える 4

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

列の長さが異なる場合は、次を使用して次のようなことを試すことができます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 に答える
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 に答える