私は少し前に似たようなものを投稿し、提供されたコードは私の問題を解決するのに役立つかもしれないと思ったが、残念ながら私は自分のニーズにそれを調整することはできません: 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
私はどんな助けも喜んで感謝しています!ここの愚かさでも申し訳ありませんが、私は完全に困惑しているようです。
多次元配列をサポートする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