첫 번째 발생 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