이중 슬래시 사이의 줄 결합

이중 슬래시 사이의 줄 결합

다음과 같은 파일이 있습니다.

//

ABC

String1

String2

BDF:
ssss

//

AFG

String4

String9

BDF:
fff 

//

나는 출력을 원한다.

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

이중 슬래시 사이의 줄만 파악하고 별도의 블록을 한 줄로 연결하려면 어떻게 해야 합니까? 슬래시 사이의 줄은 파일 전체에서 다양합니다.

답변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

관련 정보