有没有办法在awk中匹配表达式后连接行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在awk中匹配表达式后连接行?相关的知识,希望对你有一定的参考价值。
我正在尝试以更好的方式格式化文本。我想有条件地加入awk中的两个后续行:如果行以“。”结尾。如果该行不以“。”结尾,则按原样打印该行。如果后者以小写字母开头,则加入此行和后续行。
我试过这个调用awk -f脚本文件的文本文件
if ( $NF ~ /.*\./ )
print $0;
else
line_p=$0;
getline;
if ( $0 ~ /^[ a-z]+/ )
print line_p, $0;
else
print line_p;
print $0
我试过这个:
io sono un segno
cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli
opere incompiute
但输出是这样的:
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli
opere incompiute opere incompiute
我不明白最后的重复以及为什么第6和第7行没有连接在一起
预期:
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute
答案
$ awk 'printf "%s%s", (/^[[:lower:]]/ && (p !~ /\.$/) ? ofs : ors), $0; ofs=OFS; ors=ORS p=$0 ENDprint ""' file
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute
另一答案
您可以将输出记录分隔符设置为空字符串,并根据当前行是否以.
结束来设置标记,以便在处理下一行时,您可以根据标记手动输出空格或换行符以及是否在打印当前行之前,当前行以小写字母开头:
awk 'BEGINORS=""if(/\.$/)print" ";a=2elseif(a==2||/^[^a-z]/)print "\n"elseif(a)print" ";a=1ENDprint"\n"1' textfile
这输出:
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute
以上是关于有没有办法在awk中匹配表达式后连接行?的主要内容,如果未能解决你的问题,请参考以下文章