列が他のファイルと一致する場合は、一致する各行を印刷します(awk / grep)。

列が他のファイルと一致する場合は、一致する各行を印刷します(awk / grep)。

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

[ ファイル1秒[ファイル2ss

私は試した:

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

$1AWKの最初のフィールドです。

代わりに書くこと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

関連情報