string.txtとlengths.txtという2つのテキストファイルがあります。
文字列.txt:
abcdefghijklmnopqrstuvwxyz
長さ.txt
5
4
10
7
ファイルを受け取りたい
>Entry_1
abcde
>Entry_2
fghi
>Entry_3
jklmnopqrs
>Entry_4
tuvwxyz
私は200文字から56,000文字の長さの約28,000項目を作業しています。
現在私は以下を使用しています:
start=1
end=0
i=0
while read read_l
do
let i=i+1
let end=end+read_l
echo -e ">Entry_$i" >>outfile.txt
echo "$(cut -c$start-$end String.txt)" >>outfile.txt
let start=start+read_l
echo $i
done <lengths.txt
しかし、これは非常に非効率的です。より良いアイデアがありますか?
ベストアンサー1
一般的に言えば、テキストを処理するためにシェルループを使用したくありません。。ここでは以下を使用しますperl
。
$ perl -lpe 'read STDIN,$_,$_; print ">Entry_" . ++$n' lengths.txt < string.txt
>Entry_1
abcde
>Entry_2
fghi
>Entry_3
jklmnopqrs
>Entry_4
tuvwxyz
それは一つ(バッファリングを使用してread
一度に1バイト(または通常のファイルの場合は複数バイト)を読み取るシェルコマンドよりも効率的です)両方のファイルを一度だけ読み取る(メモリに完全に保存せずに)コマンドは次のとおりです。シェルループで外部コマンドを実行するソリューションよりもはるかに効率的です。
(-C
数値がバイトではなく現在のロケールの文字である必要がある場合は、このオプションを追加してください。例のASCII文字には違いはありません。)