
空白行で区切られた複数の段落を含むファイルがあります。技術的には、それらは段落ではなく、空白行で区切られたテキストのセクションにすぎません。
空白行に続く各行の最初の行に番号を挿入することで、段落に番号を付けたいと考えています。つまり、ファイルに次のように記述されているとします。
これはテキストです。 これはさらにテキストです。 さらに多くのテキスト! これはセクション 2 のテキストです。 さらにテキストを少し。 要点は分かりますね...
こう言わせたいのです:
1これはテキストです これはさらにテキストです さらに多くのテキスト! 2これはセクション2のテキストです。 さらにテキストを少し。 要点は分かりますね...
答え1
bash 組み込みコマンドでこれを試してください:
#!/bin/bash
l=1 # paragraph counter
echo -n $l # print paragraph counter without new line
while read x; do # read current line from file, see last line
if [[ $x == "" ]]; then # empty line?
echo # print empty line
read x # read next line from file, see last line
((l++)) # increment paragraph counter
echo -n $l # print paragraph counter without new line
fi
echo "$x" # print current line
done < file
答え2
一般的に、テキスト解析にシェルを使用すると非常に時間がかかり、面倒です。他のオプションをいくつか示します。
「段落モード」の Perl
perl -00pe 's/^/$./' file
説明
-00
は、段落モードをオンにします。段落モードの「行」は、連続した段落で定義されます。\n\n
は、s/^/$./
行の先頭 (^
) を現在の「行」(段落) 番号 に置き換えます$.
。は-p
、 で指定されたスクリプトを実行した後、入力ファイルの各行を印刷するように perl に指示します-e
。ぎこちない
awk -vRS='\n\n' -vORS='\n\n' '{print NR$0}' file
説明
-vRS='\n\n'
awk のレコード区切りを連続する改行文字に設定します。perl の段落モードと同様に、段落を「行」として扱います。次に、現在の行番号 (NR
) と現在の「行」を印刷するように指示します$0
。-vORS=
は、出力レコード区切りを連続する改行に設定し、出力でも段落が空白行で区切られるようにします。これにより、出力の最後に 2 つの空行が追加されることに注意してください。これを回避するには、 を使用できますhead
。awk -v RS='\n\n' -vORS='\n\n' '{print NR$0}' file | head -n -2
比較のために、10MB のテスト ファイルでさまざまなソリューションを実行したときに、私のシステムでかかった時間を以下に示します。
$ time a.sh > /dev/null ## a.sh is Cyrus's solution
real 0m1.419s
user 0m1.308s
sys 0m0.104s
$ time perl -00pe 's/^/$./' file > /dev/null
real 0m0.087s
user 0m0.084s
sys 0m0.000s
$ time awk -v RS='\n\n' -vORS='\n\n' '{print NR$0}' file | head -n -2 >/dev/null
real 0m0.074s
user 0m0.056s
sys 0m0.020s
上記のように、perl と awk の両方のソリューションは、シェル アプローチよりも桁違いに高速です。