別のテキストファイルからテキストファイルを作成する

別のテキストファイルからテキストファイルを作成する

このようなテキストファイルがあります。

word_1 root_of_word_A
word_2 root_of_word_B
word_3 root_of_word_C
word_4 root_of_word_A

その他の類似ファイル

root_of_word_A root_of_word_1
root_of_word_B root_of_word_2
root_of_word_C root_of_word_3

次のように、最初の文書の別の単語を2番目の文書の別の単語に置き換える必要があります。

word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

awkを使うとこんなことができると思います。私はこれを試しました:

awk 'NR==FNR {print $1}{c[$2]++;next};c[$1]>0{print $2}' file1 file2

問題は、file1の最初の列とfile2の2番目の列を印刷する方法がわからないことです。

最初のファイルと2番目のファイルの行数が異なると言われており、私がやりたいことをより明確にするための例があります(問題はAを1に変換するのではなく、root_of_the_word全体を変換することです)。

答え1

の単語file2が一意の場合は、ファイルの順序を逆にして配列を作成してから次のようfile2に適用できますfile1

$ awk 'NR==FNR{a[$1]=$2;next}{print $1,a[$2]}' file2 file1
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

答え2

リレーショナル結合作業を行っています。これを行う標準のUnixコマンドがありますjoinもっと多くの人がこの素晴らしいツールについて知ってほしい!

このjoinコマンドは、共通フィールドにある2つのファイルをリンクします。ただし、両方のファイルはこのフィールドでソートする必要があります。

共通フィールドは、最初のファイルのフィールド2()file1.txtと2番目のファイルのフィールド1()ですfile2.txt。次のフィールドに基づいてファイルをソートします。

$ sort -k2,2 -o file1.txt file1.txt
$ sort -k1,1 -o file2.txt file2.txt

次に、このフィールドに対して結合を実行し(マニュアルを読みますjoin)、最初のファイルのフィールド1と2番目のファイルのフィールド2のみを出力として指定し、結果をソートします(必要に応じて)。

$ join -1 2 -2 1 -o 1.1,2.2 file1.txt file2.txt | sort
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

関連情報