키워드 사이의 행을 쉼표로 구분된 값의 한 행으로 결합합니다.

키워드 사이의 행을 쉼표로 구분된 값의 한 행으로 결합합니다.

첫 번째 발생 Cat과 다음 발생 사이에 ","로 구분된 Cat별도의 줄을 만들어야 합니다 .

파일 입력은 다음과 같습니다.

Cat
AA
BB
CC
Cat
AA-1
BB-1
CC-1

예상 출력:

Cat,AA,BB,CC
Cat,AA-1,BB-1,CC-1

답변1

GNU sed 사용:

sed ':a;N;s/\n/,/;ta' file | sed 's/,Cat/\nCAT/g'

또는

tr '\n' ',' < file | sed 's/,Cat/\nCAT/g'

답변2

당신은 이것을 할 수 있습니다 sed:

sed '1{h;d;};/^Cat$/!{H;$!d;};x;s/\n/,/g;${x;/^Cat$/H;x;}' infile

설명하다:

sed '1{                   # if this is the 1st line
h                         # copy over the hold space
d                         # and delete it
}
/^Cat$/!{                 # if the line doesn't match Cat
H                         # append to hold space and
$!d                       # delete it if it's not the last line 
}
x                         # exchange pattern space w. hold buffer
s/\n/,/g                  # replace all newline chars with commas
${                        # check if the last line of input matches Cat:
x                         # exchange pattern space w. hold buffer
/^Cat$/H                  # if the line matches Cat append it to hold buffer
x                         # exchange back
}' infile

답변3

awk '
    /Cat/ {
        if (NR>1) print ""
        printf "%s", $0
        next
    } 
    {printf ",%s", $0} 
    END {print ""}
' file

awk 변수에 크게 의존하는 또 다른 버전: ("Cat"이 대소문자를 구분하지 않는 정규식이어야 한다는 귀하의 의견을 읽기 전에 추가되었습니다)

awk 'BEGIN {RS="Cat"; FS="\n"; OFS=","} NR>1 {$1=RS; NF--; print}' file

답변4

이 솔루션에서는 전체 파일을 메모리로 읽어올 필요가 없습니다. 즉, 전체 행이 1GB 미만이면 1GB 시스템에서 처리되는 1TB 파일을 처리할 수 있습니다.

perl -ne 'BEGIN { $sep = shift; }
          if(/^$sep$/o) { @p and print join(",", @p)."\n"; @p = (); }
          chomp; push @p, $_;
          END { print join(",", $sep, @p)."\n"; }' Cat /tmp/cat

관련 정보