英数字モードで(ラージ)ファイルを結合する

英数字モードで(ラージ)ファイルを結合する

私は持っています:

次のファイル 1:

sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*ALPHANUMERIC_PATTERN

次のファイル 2:

sting_of_printable_characters*ALPHANUMERIC_PATTERN

フィールド区切り文字はどこに*あり、英数字モードは常に行の最後のフィールドです。
私は次のことを達成する方法を知りませんし、助けが必要です。

デフォルトでは、「ALPHANUMERIC_PATTERN」に基づいてこれら2つのファイルを「結合」して(コマンドを試しましたが、join英数字キーでは機能しないようです)、両方のファイルに同じALPHANUMERIC_PATTERNが含まれている場合にのみ印刷する必要があります。

awk私は処理効率のためにこれを使用することを好みますが、何でも非常に役立ちます。 (このファイルは大容量です。)

問題は、次のような出力を確認する必要があることです。

ALPHANUMERIC_PATTERN*stuff_from_file_1*stuff_from_file_2

ベストアンサー1

次のことを試すことがjoinできます。

join -t\* \
<(sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file1 | sort -t\* -k1,1) \
<(sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file2 | sort -t\* -k1,1)

2 つのseds は最後のフィールドを行の先頭に移動します。

field1*field2*...field(N-1)*field(N)

~になる

field(N)*field1*field2*...*field(N-1)

その後、結果はstフィールドとstフィールドsort1順番に適用されますjoin(常に1stフィールドにあります)。これにより、次の行が印刷されます。

field(N)*fields(1)to(N-1)*from*file1*fields(1)to(N-1)*from*file2 

一時ファイルを使用してjoin結果を次のように保存したい場合outfile

sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file1 | sort -t\* -k1,1 > sorted_1
sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file2 | sort -t\* -k1,1 > sorted_2
join -t\* sorted_{1,2} > outfile
rm -f sorted_{1,2}

おすすめ記事