最初のファイルの順序とペアのない行を維持しながら、2つのテキストファイルを最初の列にリンクします。

最初のファイルの順序とペアのない行を維持しながら、2つのテキストファイルを最初の列にリンクします。

2つのファイルをマージする必要がありますが、マージする前に最初にファイルが一致する必要があります。これは私の最初のファイルで、100万行が含まれています。

abcde
fghi
jklmn
opqrs
123456
0000

2番目のファイルには300万行が含まれていますが、まだ最初のファイルの文字列を含むいくつかの行があります。

543123:fdfdss
dfskld:533fg
abcde:1234
fdskls:fkdfs
gfdkls:flfds
0000:5432
fdsk:saakl

出力:

abcde:1234
fghi
jklmn
opqrs
123456
0000:5432

出力がfile1:file2になりたいのですが、これはfile2の最初の列とfile1の文字列と一致する場合にのみ可能です。ソート形式をめちゃくちゃにしたくなく、この順序でソートしたいと思い、file1文字列を保持しながら一致する文字列だけを追加したいと思います。

答え1

簡単な方法は、awk2番目のファイルを読み取り、各行を配列(インデックスは$ 1)に保存し、最初のファイルを読み取るときにその行がすでに配列のインデックスであることを確認することです。その場合は、その行を次のように置き換えます。その要素の値:

awk -F: 'NR==FNR{z[$1]=$0;next}
($0 in z) {$0=z[$1]};1' file2 file1

これを行うこともできますが、より多くの作業が必要です(デフォルトでは、結果をソートして順序を復元するには、最初のファイルの行にjoin番号を付けます)。join

join -a 1 -t: -1 2 -2 1 <(nl -s: -ba -nrz file1 | sort -t: -k2,2) \
<(sort -t: -k1,1 file2) | sort -t: -k2,2 | cut -d: -f1,3-

関連情報