比較を使用して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
つまり、そのまま印刷されます。d
MSTRG3.1
COTJA
とにかくそうです。 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を印刷します。ビンゴ。
答え2
この試み、
awk 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1"\t"$3}' file2 file1
\t
区切り文字としては必要ありません。- あなたの要件に応じて、最初と3番目のフィールドを印刷する必要があります。
答え3
あなたのコード、
awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1
print
最後に最初の列のみが出力されるため、2つの列は絶対に出力できませんFile1
。
しかし、ほぼすべて来ました。マイナーな調整の1つは、実際に欠落しているフィールドを出力することです。
awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $3, $1}' File2 File1
^^^
add this
データに対してこれを実行すると、次のようになります。
MSTRG.1.1 a
MSTRG.3.1 d
大規模なデータセットについては、以下を参照してください。スティーブのソリューションメモリ効率が良いです。