我有一些数据看起来像这样:
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
尝试
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 机器上的任何 shell 中使用任何 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