awk:間違った場所で改行区切り文字を処理する

awk:間違った場所で改行区切り文字を処理する

次のデータがあります。

abc


123
456
789
def


111
222
333
ghi


999
888
777
666

つまり、レコードは複数行で区切られていますが、位置が間違っています。私が望むのは、次のようにすることです。

abc
123
456
789

def
111
222
333

ghi
999
888
777
666

awkで設定しようRSとしましたが、\n\n\n結果としてレコードが誤って切り捨てられました。そのabc用語は、現在のレコードの最初のフィールドではなく、以前のレコードの最後のフィールドで終わりました。

sedまた、1行ずつ動作するので、どのように使用するのかわかりません。

答え1

努力する

awk '!NF {next} /[^0-9]/ {printf XRS; XRS = ORS} 1' file2
abc
123
456
789

def
111
222
333

ghi
999
888
777

空の行を削除します(あなたの仕様では、この行は実際には空で空白がないことを読みました)。次に、レコードヘッダを表す数字以外の数字があることを確認し、最初の行を除いて改行を印刷します。空の文字列。

答え2

すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ awk '/[^0-9]/ && NR>1{print ""} NF' file
abc
123
456
789

def
111
222
333

ghi
999
888
777
666

答え3

GNU sed:

sed '1b;/^$/d;/[a-z]/s/^/\n/' file

文字列に文字がある場合は、その前に改行文字が挿入されます。

答え4

使用sed:

sed -n '/^$/d;/^[0-9]*$/{h;n;//!ba;x;G;;p;d};p;d;:a H;g;s/\n/\n\n/;p;' sample.txt

使用awk:

awk '
         NF && /^[0-9]*$/{f = 1;print} 
         NF && f && /^[^0-9]*$/{print "\n" $0; f = 0} 
         NR == 1
   ' sample.txt

使用perl:

perl -alne 'if(/^\S/){$_ = (/^\d/ || $. == 1) ? $_ : "\n$_";print}' sample.txt

関連情報