web-dev-qa-db-ja.com

sedで各行に異なるヘッダーを挿入する方法は?

770行のテキストファイルを変更し、それぞれに異なるヘッダーを追加する必要があります。たとえば、次のようになります。

CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

そして、私はこれを取得したい:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
7
Idalia Rojas

Sedソリューションを具体的に求めたので(実際にこの方法で行うことはお勧めしませんが、可能です):

$ sed = file | sed '1~2 s/^/>seq/'
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

最初の呼び出しsed = fileは裸の行番号を挿入し、2番目の呼び出しは>seq文字列を先頭に追加してそれらを修飾します。


OTOH 770の回線があることを事前に知っていれば、できる

printf ">seq%d\n" {1..770} | sed 'R file'

ただし、これはGNU sed R拡張機能に依存しています。

Rファイル名
読み取られるファイル名の行をキューに入れ、現在のサイクルの終了時、または次の入力行が読み取られたときに出力ストリームに挿入されます。 filenameを読み取れない場合、またはファイル名の最後に達した場合、エラーは表示されず、行は追加されないことに注意してください。

もちろん、事前に行数がわからない場合は、could

printf ">seq%d\n" $(seq 1 "$(wc -l < file)") | sed 'R file'

ただし、ファイルを1回読み取るだけで済むという利点は失われます。


実際には、おそらく @ John1024のawkソリューション または同等のPerlを使用します

Perl -lpe 'print ">seq" . $.' file
13
steeldriver

タスクはsedで実行できますが、sedには算術のネイティブな理解がないため、間違ったツールになります。 Awkはうまく機能します。

$ awk '{print ">seq" NR} 1' file
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

使い方:

  • print ">seq" NR

    新しい行が読み込まれるたびに、最初に必要なヘッダーが出力されます。

    NRはawkの行カウンターです。

  • 1

    これは、行を印刷するためのawkの不可解な速記です。

12
John1024

単純なループを使用する:

count=1; while read -r line ; do printf '>seq%d\n%s\n' $((count++)) "$line"; done < file

出力:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
5
Ravexina

pasteを使用:

 paste -d '\n' <(seq -f '>seq%g' 1 4) file
  • seq -f '>seq%g' 1 4は、改行で区切られた数値を標準出力に書き込みます
  • <(...)はプロセス置換です
  • pasteは、区切り文字で区切られた各ファイルの対応する行を連結します
  • -d '\n'は、連結区切り文字をデフォルトのタブではなく改行に設定します
0
gardenhead