awkを使用してファイルを比較し、両方のファイルの出力をマージしますか?

awkを使用してファイルを比較し、両方のファイルの出力をマージしますか?

比較を使用して2つのファイルを比較しようとしていますが、両方のファイルawkのデータを出力として印刷したいと思います。私が比較するファイルは次のとおりです。

ファイル1:

gene             feature id            fc         
a                gene                 MSTRG.1.1           
b                gene                 MSTRG.1.2   
c                gene                 MSTRG.2.1 
d                gene                 MSTRG.3.1   

ファイル2:

MSTRG.1.1       ALLMI        
MSTRG.3.1       COTJA   
MSTRG.4.1       SORCY 

私は次のコマンドを使用しています:

$ awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1

私は出力が次のようになります:

a ALLMI
c COTJA
d SORCY,

しかし、現在は次のような結果しか得られません。

a    
c    
d

どちらのファイルもタブで区切られていますが、なぜ私のコマンドが機能しないのかわかりません。

ベストアンサー1

奇妙なソリューション

これはどうですか。提供された正確な出力を提供しませんが、理由は不明です。d SORCYつまり、そのまま印刷されます。dMSTRG3.1COTJA

とにかくそうです。 10人が始まりました。 GNU Awk v4.0.2でうまく動作します。

$ awk 'NR==FNR{a[$1]=$2}NR!=FNR&&FNR>1&&a[$3]{print $1,a[$3]}' file2 file1
a ALLMI
d COTJA
$

NR が FNR と等しい場合、最初のファイルにあるため、配列が埋められます。

NRがFNRと異なる場合は2番目のファイルにあるため、そのファイルの最初のレコード(ヘッダー)を通過し、フィールド3が配列にある場合はそれを印刷します。

「ゴルフ」awkソリューション

読みやすさは低下しますが、コードは短くなります。

awk 'NR==FNR{a[$1]=$2}a[$3]{print$1,a[$3]}' file{2,1}

ソリューションに参加する

または、実装に特に使用する必要がない場合awkにのみ使用してくださいjoin

$ join -1 3 -2 1 -o "1.1 2.2" file1 file2
a ALLMI
d COTJA
$

-1 3ファイル1のフィールド3()とファイル2のフィールド1()を使用してファイルをリンクします-2 1。次に、ファイル1のフィールド1とファイル2のフィールド2を印刷します。ビンゴ。

おすすめ記事