このようなテキストファイルがあります。
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