根据行开头加入行

时间:2017-02-14 22:52:08

标签: unix awk sed

我有一个偶尔会有分割线的文件。通过行以空格,空行或非数字字符开头的事实来表示拆分。 E.g。

40403813|7|Failed|No such file or directory|1
40403816|7|Hi, The Conversion System could not be reached.|No such file or directory||1
40403818|7|Failed|No such file or directory|1
...

我想将分割线加回到上一行(如下所述):

int(24733) *
int(1103515245) +
int(24691)

使用像sed / awk这样的Unix命令。我不清楚如何加入前一行。

有什么建议吗?

6 个答案:

答案 0 :(得分:4)

awk救援!

awk -v ORS='' 'NR>1 && /^[0-9]/{print "\n"} NF' file

仅在当前行以数字开头时打印换行符,否则追加行(如果换行符没有保留空格,您可能想要向ORS添加空格)。

答案 1 :(得分:3)

不要根据字段中字符串的值执行任何操作,因为这可能会出错。例如,您可以获得以数字开头的包装线。相反,只需在每个完整的5个字段记录后打印:

$ awk -F'|' '{rec=rec $0; nf+=NF} nf>=5{print rec; nf=0; rec=""}' file
40403813|7|Failed|No such file or directory|1
40403816|7|Hi, The Conversion System could not be reached.|No such file or directory||1
40403818|7|Failed|No such file or directory|1

答案 2 :(得分:2)

尝试:

    awk 'NF{printf("%s",$0 ~ /^[0-9]/ && NR>1?RS $0:$0)} END{print ""}'   Input_file
OR
    awk 'NF{printf("%s",/^[0-9]/ && NR>1?RS $0:$0)} END{print ""}'  Input_file

它会检查每一行是否从一个数字开始,如果是,大于行号1,它将插入一个新行 - 否则它只会打印它,也会在读完后打印一个新行整个文件,如果我们不提及它,它就不会在文件读取结束时插入它。

答案 3 :(得分:2)

如果您只将该行拆分为两行,则可以使用此sed命令:

sed 'N;s/\n\([^[:digit:]]\)/\1/;P;D' infile

这会将下一行追加到模式空间,检查换行符后面是非数字的内容,如果是,则删除换行符,将模式空间打印到第一个换行符,然后删除打印的部分。

如果单行可以跨越两行,我们必须循环替换:

sed ':a;N;s/\n\([^[:digit:]]\)/\1/;ta;P;D' infile

如果发生替换,则会从ta分支到:a

要在Mac OS上使用sed,标签和分支命令必须与命令的其余部分分开:

sed -e ':a' -e 'N;s/\n\([^[:digit:]]\)/\1/;ta' -e 'P;D' infile

答案 4 :(得分:2)

如果连续行始终以单个空格开头:

perl -0000 -lape 's/\n / /g' input

如果连续行可以以任意数量的空格开头:

perl -0000 -lape 's/\n(\s+)/$1/g' input

写作可能更具惯用性:

perl -0777 -ape 's/\n / /g' input

答案 5 :(得分:1)

如果您的文件没有sed,则可以使用\r

tr "\n" "\r" < inputfile | sed 's/\r\([^0-9]\)/\1/g' | tr '\r' '\n'