sed(GNU)

sed(GNU)

テキスト処理ツールを使用してN行ごとに新しい行を挿入するにはどうすればよいですか?

N=2 の例:

入力する:

sadf
asdf
yxcv
cxv
eqrt
asdf

出力:

sadf
asdf

yxcv
cxv

eqrt
asdf

答え1

そしてawk

awk ' {print;} NR % 2 == 0 { print ""; }' inputfile

そしてsedGNU拡張):

sed '0~2 a\\' inputfile

そしてbash

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"

答え2

sed(GNU)

(GNU)の使用sed:

sed '0~2G'

短い(N = 100には適していません):

sed 'n;G'

man sed は ~ を次のように解釈します。

first〜stepは、
最初の行から始まるすべての最初のステップと一致します。たとえば、「sed -n 1〜2p」は入力ストリームのすべての奇数行を印刷し、アドレス2〜5は2行目から始まり、5行目ごとに一致します。最初の値はゼロです。この場合、sedはstepと同じように機能します。 (これは拡張です。)

sed(その他)

他のsedの使用(新しい行の計算):

sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'

または、より移植性を高めるために、以下を作成します(一部のsedバージョンのコメントを削除)。

sed -e '             # Start a sed script.
         p            # Whatever happens later, print the line.
         s/.*//       # Clean the pattern space.
         H            # Add **one** newline to hold space.
         x            # Get the hold space to examine it, now is empty.
         /\n\{2\}/{   # Test if there are 2 new lines counted.
             g        # Erase the newline count.
             p        # Print an additional new line.
           }          # End the test.
         x            # match the `x` done above.
         d            # don't print anything else. Re-start.
       '              # End sed script.

アッ

としてawk、おそらく:

awk '1 ; NR%2==0 {printf"\n"} '

答え3

使用paste

 paste -d'\n' - - /dev/null <file

答え4

別のawkスタイル:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'

関連情報