ファイルテキストを書き換えようとしています。メインファイル.txt次から変更変更.txt。これメインファイル.txtファイルは次のようになります。
word_1 genre_A
word_2 genre_A
word_3 genre_B
word_4 genre_C
word_5 genre_A
しかも変更.txt次のようになります。
genre_A root_A
genre_C root_C
内容を変更したい変更.txt存在するメインファイル.txt次のようなものを入手してください。
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A
このファイルは非常に大きく、自動方法が必要です。
すべての変数をロードしようとしています。変更.txt配列を入れてawk
異なる場合は同じ内容を印刷し、同じ場合は変更します。このような:
NR==FNR{a[$1,$2]++;next} $3==a[$1] {print $1,$2,a[$2]} $3!=a[$1] {print $1,$2,$3}
しかし、私は何かが間違っていた。命令語でも可能だと聞きましたが、join
慣れていないので、各部分の説明をしていただければ役に立ちそうです。
みんなありがとうございます。
ベストアンサー1
コマンドに言及しましたが、join
この場合は使用するのは簡単ではありません。少なくともそれ自体ではそうではありません。
これら2つのファイルを組み合わせてみましょう。これを行うには、まず結合フィールドでファイルをソートする必要があります。最初のファイルの2番目のフィールドと2番目のファイルの最初のフィールドを使用しますjoin
(デフォルト)。
$ sort -k2 -o main.txt main.txt
$ sort -k1 -o changes.txt changes.txt
次に接続します。
$ join -1 2 main.txt changes.txt
genre_A word_1 root_A
genre_A word_2 root_A
genre_A word_5 root_A
genre_C word_4 root_C
我々は行を逃した。もう一度やり直して、無視される行も出力するようにjoin
指示します(で何も一致しないため)。main.txt
changes.txt
$ join -1 2 -a 1 main.txt changes.txt
genre_A word_1 root_A
genre_A word_2 root_A
genre_A word_5 root_A
word_3 genre_B
genre_C word_4 root_C
join
目的の出力の2番目の列には2つのファイルのデータが混在しているため、2つのファイルのうち特定の列のみを出力する必要はありません。
しかし、上記の出力を使用すると、単純なスクリプトを使用して最後の2つの列を抽出できます(右から列を取得するには、負のフィールド仕様を採用できたらいいですawk
!)。cut
$ join -1 2 -a 1 main.txt changes.txt | awk '{ print $(NF-1), $NF }'
word_1 root_A
word_2 root_A
word_5 root_A
word_3 genre_B
word_4 root_C
整列するようにパイプしますsort
。
$ join -1 2 -a 1 main.txt changes.txt | awk '{ print $(NF-1), $NF }' | sort
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A