连接双正斜杠之间的行

连接双正斜杠之间的行

我有一个如下所示的文件:

//

ABC

String1

String2

BDF:
ssss

//

AFG

String4

String9

BDF:
fff 

//

我希望输出是

ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff

如何只 grep 双正斜杠之间的行并将单独的块连接到一行中?请注意,整个文件中正斜杠之间的行有所不同。

答案1

尝试使用 GNU awk,它允许将 RS 设置为多个字符并设置为双斜线//;然后打印用设置分隔的逗号分隔的字段OFS=', ',并使用将冒号-逗号返回到冒号gsub();设置的目的$1=$1是触发 awk 根据 OFS 设置重建字段print

awk -v RS='//' 'NF{ $1=$1; gsub(":,", ":"); print }' OFS=', ' infile

答案2

对于任何标准 awk:

/^\/\//{                 #If this line begins with //
    sub(/:,/,":",line)   #Substitute :, with :
    if(line){print line} #If `line` is not blank, print it
    line=""              #Reset `line`
    next                 #Start next cycle with next line
}
#If current line not empty, append it to `line` with separator if `line` not empty
!/^$/{line=(line?line", ":"")$0}

保存上述脚本(例如,作为joinlines.awk)并在输入文件上运行它:

$ awk -f joinlines.awk file
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff 

答案3

$ cat tst.awk
$0 == "//" {
    if ( NR > 1 ) {
        print rec
    }
    rec = sep = ""
    next
}
NF { rec = rec (prevNF ? " " : sep) $0; sep=", " }
{ prevNF = NF }

$ awk -f tst.awk file
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff

答案4

tot=`sed '/\/\//d' inputfile| sed '/^$/d'| awk 'END{print NR}'`
sed '/\/\//d' inputfile| sed '/^$/d' > finalfile

for ((i=1;i<=$tot;i++)); do z=$(($i + 4)); sed -n ''$i','$z'p' finalfile| perl -pne "s/\n/, /g"; i=$z;echo -e "\n"; done|sed '/^$/d'| awk '{gsub(",","",$NF);print $0}'| sed "s/:,/:/g"

输出

ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff

相关内容