巨大なテキストファイルの一定数の文字の後に改行文字を挿入できるbashまたはsedスクリプト(できればワンライナー)を探しています。
このようなものはどうですか? Change 20は改行の前の文字数で、temp.textは置換するファイルです。
sed -e "s/.\{20\}/&\n/g" < temp.txt
POSIXソリューションは次のとおりです。
awk '{gsub(/.{5}/,"&\n")}1' file
または:
fold -w5 file
入力:
banana strawberry grape
出力:
banan
a str
awber
ry gr
ape
興味深いことに、Awkソリューションはフォールドよりもパフォーマンスに優れています。
Nを、改行が必要になる文字数を表すシェル変数とします。行をまたいでカウントを継続する場合:
Perl -0xff -pe 's/(.{'$N'})/$1\n/sg' input
各行のカウントを再開する場合は、-0xff引数を省略します。
(評判を下げるために)直接コメントすることはできないため、上位のコメントに対する新しいヒントがあります。
sedコマンド(まさに私が望むもの)を好み、Posix-Command foldもテストしました。しかし、元の問題の両方のコマンドには少し違いがあります:n * bytesレコード(改行文字なし)のフラットファイルがあり、sedコマンド(number as bytes(20 @Kristianの答えで))wcでカウントするとn行になります。 foldコマンドを使用すると、wc!でn-1行しか取得できません。入力ファイルに改行文字が含まれていない場合、sedで最後の行の後に改行があり、foldで誰もいない場合、この違いは知っておくことが重要です。
正確に42文字の行の後に空行を追加します
sed -ie '/^.\{42\}$/a\
' huge_text_file
ファイル全体に関して、文字数の後に、たとえばファイル全体の30番目の文字の後に改行を挿入したい場合
gawk 'BEGIN{ FS=""; ch=30}
{
for(i=1;i<=NF;i++){
c+=1
if (c==ch){
print ""
c=0
}else{
printf $i
}
}
print ""
}' file
各行に特定の数の文字を挿入する場合(5文字ごとなど)
gawk 'BEGIN{ FS=""; ch=5}
{
print substr($0,1,ch) "\n" substr($0,ch)
}' file
これはあなたのために働くかもしれません:
echo aaaaaaaaaaaaaaaaaaaax | sed 's/./&\n/20'
aaaaaaaaaaaaaaaaaaaa
x