1

その名前とその名前に関連付けられたいくつかの追加情報を持つ、他のより大きなファイル(入力)から名前のリストを抽出したい。私の問題は grep -f オプションにあります。これは、入力ファイル内の正確なエントリと一致するのではなく、同様の名前を含む他のエントリと一致するためです。

私は試した:

$ grep -f list.txt -A 1 input >output

ファイルの形式は次のとおりです。

list.txt

TE_final_35005
TE_final_1040

入力ファイル

>TE_final_10401
ACGTACGTACGTACGT
>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

必要な出力:

>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

私が得ている出力:

>TE_final_10401
ACGTACGTACGTACGT
>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

TE_final_10401list.txtにはありませんが

リストでどのように使用できます^か?

正確な値を一致させるか、これを行う他の方法を提案してください。

4

3 に答える 3

2

単語全体をスイッチ ( -w) に追加します。

grep -w -A1 -f list.txt infile

出力:

>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT
于 2012-12-19T17:51:00.820 に答える
2

いくつかのこと、最初にファイルから空白行を削除します。

sed  -i '/^\s*$/d' file list

次に-w、単語全体のみを照合するために使用され-A1、一致の後に次の行が出力されます。

$ grep -w -A1 -f list file > new_file

$ cat new_file
>TE_final_35005
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT
于 2012-12-19T17:54:49.623 に答える
1

他の人が述べたように、フラグを追加すること-wは、サンプル データに基づく最もクリーンで簡単な方法です。^しかし、でどのように使用できるかを明示的に尋ねたのでlist.txt、ここに別のオプションがあります。

の各行に^および/またはアンカーを追加するには:$list.txt

$ cat list.txt
^>TE_final_35005[ ]*$
^>TE_final_1040[ ]*$

これにより、行の先頭でパターンが検索され、前に>文字があり、末尾のスペースは無視されます。その後、前のコマンドが機能します(これらの空白行を削除するか、引数を に変更すると仮定します-A 2)。

これらのアンカーをリスト ファイルに自動的に追加したい (そして同時に空行を削除したい) 場合は、次のawk構文を使用します。

awk '{if($0 != ""){print "^>"$0"[ ]*$"}}' list.txt >newlist.txt

sedまたは、インプレース編集を好む場合:

sed -i '/^[ ]*$/d;s/\(.*\)/^>\1[ ]*$/g' list.txt
于 2012-12-19T18:15:32.227 に答える