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

尝试

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

相关内容