次のデータがあります。
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