
다음과 관련해 도움이 필요합니다.
A
B
C
1
2
Q
W
A
빈 열을 찾을 때마다 해당 열을 새 열로 분할합니다.
산출:
A,1,Q
B,2,W
C,,A
Sed를 사용했는데 분할할 키워드를 찾을 수 없습니다. 데이터가 너무 많아서 효율적으로 처리할 수 있는 방법이 없을까요?
감사해요
답변1
$ csplit -zsf file ip.txt /^$/+1 {*}
$ paste -d, file* | head -n -1
A,1,Q
B,2,W
C,,A
매뉴얼에서:
분할- 파일을 컨텍스트 라인에 따라 결정된 부분으로 분할
-z, --elide-빈 파일빈 출력 파일 제거
-s, --quiet, --silent출력 파일 크기 수를 인쇄하지 않음
-f, --prefix=접두사'xx' 대신 PREFIX를 사용하세요.
반죽- 파일 라인 병합
-d, --delimiters=목록TAB 대신 LIST의 문자 재사용
head -n -1
마지막 행을 삭제하려면 다음을 사용할 수도 있습니다.sed '$d'
답변2
$ cat tst.awk
BEGIN { RS=""; FS="\n"; OFS="," }
{
numRows = (NF>numRows ? NF : numRows)
numCols = colNr = NR
for (rowNr=1; rowNr<=NF; rowNr++) {
vals[rowNr,colNr] = $rowNr
}
}
END {
for (rowNr=1; rowNr<=numRows; rowNr++) {
for (colNr=1; colNr<=numCols; colNr++) {
printf "%s%s", vals[rowNr,colNr], (colNr<numCols ? OFS : ORS)
}
}
}
.
$ awk -f tst.awk file
A,1,Q
B,2,W
C,,A
위의 내용은 모든 입력을 메모리에 저장하므로 YMMV는 "거대한"의 의미에 따라 다릅니다 I have huge data
. 입력과 같이 단지 수백만 개의 빈 줄로 구분된 청크라면 괜찮지만, 테라바이트 규모의 데이터라면 그럴 수 있습니다. 작동하지.