.csv 파일의 열을 모두 동일하게 전환하세요.

.csv 파일의 열을 모두 동일하게 전환하세요.

행과 열이 있는 20개의 Excel 파일이 있습니다 6x6. 여기서 첫 번째 행과 열은 문자열 헤더입니다. 이러한 각 파일에는 4개의 동일한 열 및 행 헤더가 있으며 1개는 다릅니다. 각 파일에서 동일한 헤더를 가진 열과 행이 동일한 순서로 되고 다른 행과 열이 항상 마지막에 있도록 수정하는 방법을 알고 싶습니다.

예를 들어:

a.csv다음과 같은 경우 :

    a   b   d   c   x
a   1   2   3   5   3
b   2   2   5   5   2
d   2   3   4   4   6
c   5   5   6   6   5
x   3   1   6   7   9

다음과 같습니다 b.csv.

    d   c   b   a   y
d   2   3   6   5   3
c   5   2   6   6   5
b   6   4   2   3   4
a   6   4   4   6   2
y   5   3   6   7   9

다음과 같습니다 c.csv.

    a   c   d   b   z
a   3   3   5   5   2
c   5   4   6   6   1
d   7   4   5   7   2
b   3   2   6   6   7
z   5   3   6   4   7

잠깐만요...파일 20개 모두에 대해

이것이 내가 원하는 모습입니다:

a.csv:

    a   b   c   d   x
a   1   2   5   3   3
b   2   2   5   5   2
c   5   5   6   6   5
d   2   3   4   4   6
x   3   1   7   6   9

b.csv:

    a   b   c   d   y
a   6   4   4   6   2
b   3   2   4   6   4
c   6   6   2   5   5
d   5   6   3   2   3
y   7   6   3   5   9

c.csv 및 나머지 Excel 파일과 동일합니다.

답변1

각 호출의 고정 순서(예: a,b,c,d)에 대해 awk다음과 같은 프로그램을 사용하여 작업을 수행할 수 있습니다.

awk -v order=',a,b,c,d' '

BEGIN {
    OFS = FS = "\t"
    n = split(order,ord,",")
    for (i=1; i<=n; i++) ind[ord[i]] = i
}
FNR==1 {
    for (i=2; i<=n; i++) prm[ind[$i]] = i
}
{
    out[$1] = sprintf("%s", $1)
    for (i=2; i<=n; i++) {
        out[$1] = out[$1] sprintf("%s%s", OFS, $prm[i])
    }
    out[$1] = out[$1] sprintf("%s%s", OFS, $NF)
}
ENDFILE {
    for (i=1; i<=n; i++) print out[ord[i]]
    print out[$1] ORS
}

' a.csv b.csv c.csv

참고: 위의 내용으로 인해 ENDFILE이 코드는 최신 버전의 GNU awk(4.x)를 가정합니다. (사용할 수 없는 경우 솔루션을 조정해야 합니다.)

참고 2: 파일을 개별적으로 처리하려면( 호출당 하나의 데이터 파일) 다음으로 awk대체할 수 있습니다 ( 이전 버전에서도 작동함).ENDFILEENDawk

샘플 데이터의 결과는 다음과 같습니다.

    a   b   c   d   x
a   1   2   5   3   3
b   2   2   5   5   2
c   5   5   6   6   5
d   2   3   4   4   6
x   3   1   7   6   9

    a   b   c   d   y
a   6   4   4   6   2
b   3   2   4   6   4
c   6   6   2   5   5
d   5   6   3   2   3
y   7   6   3   5   9

    a   b   c   d   z
a   3   5   3   5   2
b   3   6   2   6   7
c   5   6   4   6   1
d   7   7   4   5   2
z   5   4   3   6   7

관련 정보