web-dev-qa-db-ja.com

awk-2つのファイルを比較し、両方のファイルの列を出力する

私は少し前に似たようなものを投稿し、提供されたコードは私の問題を解決するのに役立つかもしれないと思ったが、残念ながら私は自分のニーズにそれを調整することはできません: awk-ファイルと印刷行を比較両方のファイルから

そのため、2つのタブ区切りファイルがあります。

file_1.txt

Apple    2.5    5     7.2
great    3.8    10    3.6
see      7.6    3     4.9
tree     5.4    11    5
back     8.9    2     2.1

file_2.txt

Apple    :::N
back     :::ADJ
back     :::N      
around   :::ADV      
great    :::ADJ         
bee      :::N         
see      :::V      
tree     :::N         

出力は次のようになります。

Apple    :::N      2.5    5     7.2     
great    :::ADJ    3.8    10    3.6
back     :::ADJ    8.9    2     2.1
back     :::N      8.9    2     2.1
see      :::V      7.6    3     4.9
tree     :::N      5.4    11    5 

他の投稿との違いは、file_1.txtとfile_2.txtの最初の列を比較し、file_1.txtの2行目を含むfile_1.txtの行全体を出力ファイルに出力することです。 file_2.txtの$ 2が出力ファイルに出力される順序は気にしません。したがって、出力ファイルは次のようになります。

back     8.9    2     2.1    :::N
back     8.9    2     2.1    :::V etc.

ここで問題となっているのは、column1の重複です。それ以外の場合は、もちろんpasteを使用できます。この `awk-commandの問題は、配列のcolumn2を読み取らないことであり、印刷するように指示した場合、これはもちろん不可能です。

awk 'NR==FNR {a[$1]; next} $1 in a {print $0, a[$2]}' OFS='\t' file_2.txt file_1.txt > outfile.txt

私はどんな助けも喜んで感謝しています!ここの愚かさでも申し訳ありませんが、私は完全に困惑しているようです。

2
dani_anyman

多次元配列をサポートするGNU awk(パッケージgawkを介してリポジトリから利用可能)がある場合、次のようにできます。

gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt

例.

$ gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt
Apple   2.5     5       7.2     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N

それ以外の場合、出力順序が重要でない場合、おそらく最も簡単な解決策は、代わりにjoinコマンドを使用することです。

$ join -t $'\t' <(sort file_1.txt) <(sort file_2.txt)
Apple   2.5     5       7.2     :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
3
steeldriver