![빈 행이 발견되면 새 열로 변경 [중복]](https://linux55.com/image/180312/%EB%B9%88%20%ED%96%89%EC%9D%B4%20%EB%B0%9C%EA%B2%AC%EB%90%98%EB%A9%B4%20%EC%83%88%20%EC%97%B4%EB%A1%9C%20%EB%B3%80%EA%B2%BD%20%5B%EC%A4%91%EB%B3%B5%5D.png)
다음과 같은 데이터가 있습니다.
q
w
e
e
r
r
t
23
21
1
빈 행을 찾을 때마다 이를 새 열로 변경합니다.
산출
q,e,23
w,r,21
e,r,1
,t,
나는 그것을 시도했지만 sed를 사용하여 줄을 변경할 수 없습니다. 이를 달성할 수 있는 방법을 알려주십시오.
답변1
awk를 추천할 수 있습니다. 줄 구분 기호를 빈 줄로 설정하고 해당 줄을 변수로 수집할 수 있습니다. 마지막에는 수집된 변수를 표시할 수 있습니다.
이 같은:
awk 'BEGIN{RS="\n\n";}{A=(A","$1);B=(B","$2);C=(C","$3);D=(D","$4)}END{print A;print B;print C;print D}' input.txt |sed s/'^,'//
그러나 원칙은 남아 있습니다. 실제로는 테이블 전치입니다.
답변2
한 가지 옵션은 모든 줄 바꿈을 쉼표로 바꾼 다음(궁극적으로 CSV를 원하는 것 같으므로) 이중 쉼표를 줄 바꿈으로 바꾸고 중복 공백을 제거하는 것입니다. 마지막으로 결과는 다음과 같이 바뀐다 datamash
:
tr '\n' ',' < input.dat |
sed 's/,,/\n/g' |
tr -d ' ' |
datamash --no-strict --filler='' -t ',' transpose
답변3
실제 다차원 배열과 "조인" 기능을 외부 라이브러리로 포함하는 GNU awk 사용:
gawk '
@include "join"
BEGIN {row=0; col=0}
NF == 0 {col++; row=0; next}
{data[row][col] = $1; row++}
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (r in data)
print join(data[r], 0, col, ",")
}
' file
산출
q,e,23
w,r,21
e,r,1
,t,
답변4
$ cat tst.awk
BEGIN {
OFS = ","
numCols = 1
}
!NF {
rowNr = 0
++numCols
next
}
{
vals[++rowNr,numCols] = $0
numRows = (rowNr > numRows ? rowNr : numRows)
}
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
q,e,23
w,r,21
e,r,1
,t,