両方のファイルの一致する列をマージするか、デフォルト値を使用します。

両方のファイルの一致する列をマージするか、デフォルト値を使用します。

ファイルテキストを書き換えようとしています。メインファイル.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.txtchanges.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

おすすめ記事