メモリ効率的な方法で文字列を「バイナリ」検索/置換することができる非ラインベースのツールを知っている人はいますか?バラよりこの問題また。
次のような操作を実行したい+2 GBのテキストファイルがあります。
sed -e 's/>\n/>/g'
これは、a以降に発生した改行をすべて削除したいが、>
他の場所で行われた改行は削除しないことを意味しますtr -d
。
このコマンドは(私が始めた同様の質問に対する回答)は次のように失敗しますcouldn't re-allocate memory
。
sed --unbuffered ':a;N;$!ba;s/>\n/>/g'
それでは、C言語以外に他の方法はありませんか?私はPerlが嫌いですが、この場合は例外を作りたいです:-)
データに文字があるかどうかわからないので、\n
可能であれば他の文字に一時的に置き換えることを避けたいと思います。
良いアイデアがありますか?
ベストアンサー1
これはPerlでは本当に些細なことなので、憎むべきではありません!
perl -i.bak -pe 's/>\n/>/' file
説明する
-i
:ファイルを所定の場所に編集し、という名前の元のファイルのバックアップを作成しますfile.bak
。バックアップが必要ない場合は、使用してくださいperl -i -pe
。-pe
:入力ファイルを1行ずつ読み、与えられたスクリプトを適用して各行を印刷します-e
。s/>\n/>/
:交換してくださいsed
。
awk
1つの方法は次のとおりです。
awk '{if(/>$/){printf "%s",$0}else{print}}' file2