我有一个如下所示的文件:
//
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