次のファイルがあります。
//
ABC
String1
String2
BDF:
ssss
//
AFG
String4
String9
BDF:
fff
//
出力が欲しいです。
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff
二重スラッシュ間の行だけを把握し、別々のブロックを1行にリンクするにはどうすればよいですか?スラッシュ間の行はファイル全体で異なります。
答え1
awk
RSを複数の文字に設定し、二重スラッシュに設定できるGNUを試してください//
。次に、設定で区切られた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