我有一个偶尔会有分割线的文件。通过行以空格,空行或非数字字符开头的事实来表示拆分。 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命令。我不清楚如何加入前一行。
有什么建议吗?
答案 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'