빈 행이 발견되면 새 열로 변경 [중복]

빈 행이 발견되면 새 열로 변경 [중복]

다음과 같은 데이터가 있습니다.

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,

관련 정보