행과 열이 있는 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
대체할 수 있습니다 ( 이전 버전에서도 작동함).ENDFILE
END
awk
샘플 데이터의 결과는 다음과 같습니다.
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