내 CSV 파일은 다음과 같습니다
8 id1 xyz
1 id1 abcdef
2 id1 mv
1 id1 tzfl
6 id2 xyz
1 id2 abcdef
1 id2 mv
5 id3 xyz
2 id3 abcdef
...
8 id100 xyz
1 id100 abcdef
2 id100 mv
1 id100 tzfl
4 id100 glkgb
이 파일을 동일한 ID로 정렬한 후 다음 형식으로 컬럼3과 컬럼1을 인쇄하고 싶습니다.
xyz abcdef mv tzfl glkgb
id1 8 1 2 1
id2 6 1 1
id3 5 2
...
id100 8 1 2 1 4
어떤 제안이라도 감사하겠습니다!
답변1
awk
훌륭한 도구입니다. 훌륭한 튜토리얼이 있습니다 awk
.Awk - 튜토리얼 및 소개 - Bruce Barnett - Grymoire
이 시도:
awk '
{
columns[$3]=1 ; ids[$2]=1 ; col1[$2 ":::" $3]=$1
if (maxcollen< length($1)) maxcollen=length($1)
if (maxcollen< length($2)) maxcollen=length($2)
if (maxcollen< length($3)) maxcollen=length($3)
}
END {
printf("%-" maxcollen "s ", "")
for (key in columns) {
printf("%-" maxcollen "s ",key)
}
for (id in ids) {
printf("\n%-" maxcollen "s ", id)
for (key in columns) {
printf("%-" maxcollen "s ", col1[id ":::" key])
}
}
printf("\n")
}' myfile.csv
산출:
glkgb tzfl mv abcdef xyz
id3 2 5
id100 4 1 2 1 8
id1 1 2 1 8
id2 1 1 6
==
표시 순서대로 열과 ID를 표시하는 다른 버전:
awk '
{
if (colname[$3]!=1) {colname[$3]=1 ; cols[++coln]=$3 }
if (idval[$2]!=1) {idval[$2]=1 ; ids[++idn]=$2 }
col1[$2 ":::" $3]=$1
if (maxcollen< length($1)) maxcollen=length($1)
if (maxcollen< length($2)) maxcollen=length($2)
if (maxcollen< length($3)) maxcollen=length($3)
}
END {
printf("%-" maxcollen "s ", "")
for (i=1; i<=coln ; i++ ) {
printf("%-" maxcollen "s ",cols[i])
}
for (j=1; j<=idn ; j++) {
printf("\n%-" maxcollen "s ", ids[j])
for (i=1; i<=coln ; i++) {
printf("%-" maxcollen "s ", col1[ids[j] ":::" cols[i]])
}
}
printf("\n")
}' myfile.csv
산출:
xyz abcdef mv tzfl glkgb
id1 8 1 2 1
id2 6 1 1
id3 5 2
id100 8 1 2 1 4