2つの入力ファイルがあり、1つはいくつかのID番号を含み、もう1つは多数のID番号と追加の列を含みます。後者のファイルには各ID番号に複数の行が含まれており、最初のファイルからIDと一致するすべての行を抽出する必要があります。その後、この行を新しいファイルに印刷する必要があります。
編集1:サンプルファイルを実際の抜粋に置き換えました。
編集2:抜粋から余分なスペースを削除しましたが、実際のファイルから削除しませんでした。何らかの方法でファイルをクリーンアップする必要があるかもしれませんが、正確な方法は不明です。
ファイル1:
AT1G56430
AT3G55190
AT3G22880
ファイル2:
AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI
AT1G56430|GO:0009555|IGI
AT1G56430|GO:0030418|IGI
期待される出力
AT1G56430|GO:0010233|IGI
AT1G56430|GO:0009555|IGI
AT1G56430|GO:0030418|IGI
[ [
私は試した:
awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2 > output.txt
そして:
grep -Ff file2 file1 > output.txt
私はこのフォーラムと他のフォーラムに同様の質問がたくさん投稿されていることを知っています。しかし、これらは出力として何をすべきか言及せず、複製についても言及しません。私はこの解決策の4つを試してみましたが、数時間この問題を解決してみましたが、それでも同じ問題に直面しました:空の出力ファイル。
私は初めてawkに触れ、助けてくれて本当にありがとう。構文などの簡単な質問で申し訳ありません。助けてくれてありがとう。
答え1
AWKスクリプトはほぼ完了しました。
awk -F'|' 'NR==FNR{c[$1]++;next};c[$1] > 0' file1 file2 > output.txt
これは、MacからUnixに行末を変更した後に機能します。
tr '\r' '\n' < file1 > file1.new
mv file1.new file1
tr '\r' '\n' < file2 > file2.new
mv file2.new file2
$1
AWKの最初のフィールドです。
代わりに書くことc[$1] > 0
ができますc[$1]
。必要ありません> 0
: 0 以外の値であれば、すべて可能であるため、c
以下を使用することをお勧めします。
awk -F'|' 'NR==FNR{c[$1]++;next};c[$1]' file1 file2 > output.txt
答え2
このawkコマンドを試してください。
bash-4.1$ cat file1
1
3
bash-4.1$ cat file2
1|A|B
1|C|D
2|E|F
3|G|H
bash-4.1$ awk -F\| 'NR==FNR{F1[$0];next}$1 in F1{print}' file1 file2
1|A|B
1|C|D
3|G|H
答え3
すでに試してみましたjoin
か?
$ tail -n +1 -- file1 file2
==> file1 <==
AT1G56430
AT3G55190
AT3G22880
==> file2 <==
AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI
AT1G56430|GO:0009555|IGI
AT1G56430|GO:0030418|IGI
$ join -t'|' file1 file2
AT1G56430|GO:0010233|IGI
AT1G56430|GO:0009555|IGI
AT1G56430|GO:0030418|IGI