二重スラッシュ間の行の結合

二重スラッシュ間の行の結合

次のファイルがあります。

//

ABC

String1

String2

BDF:
ssss

//

AFG

String4

String9

BDF:
fff 

//

出力が欲しいです。

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

二重スラッシュ間の行だけを把握し、別々のブロックを1行にリンクするにはどうすればよいですか?スラッシュ間の行はファイル全体で異なります。

答え1

awkRSを複数の文字に設定し、二重スラッシュに設定できるGNUを試してください//。次に、設定で区切られたOFS=', 'カンマ区切りのフィールドを印刷し、設定gsub()の目的は$1=$1awkを実行することです。 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

関連情報