==

==

내 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

관련 정보