awk基础-行列转换

行列转换1

如下文件内容:

name age
alice 21
ryan 30

需求是经过转换后得到:

name alice ryan
age 21 30
awk '
  {
    # 区分第一个字段和非第一个字段
    for(i=1;i<=NF;i++){
      if(!(i in arr)){
        arr[i]=$i
      } else {
        arr[i]=arr[i]" "$i
      }
    }
  }
  END{
    for(i=1;i<=NF;i++){
      print arr[i]
    }
  }
' a.txt

行列转换2

文件内容:

74683 1001
74683 1002
74683 1011
74684 1000
74684 1001
74684 1002
74685 1001
74685 1011
74686 1000
....
100085 1000
100085 1001

文件就两列,希望处理成

74683 1001 1002 1011
74684 1000 1001 1002
...

就是只要第一列数字相同, 就把它们的第二列放一行上,中间空格分开。awk代码:

{
  if($1 in arr){
    arr[$1] = arr[$1]" "$2
  } else {
    arr[$1] = $2
  }
}

END{
  for(i in arr){
    printf "%s %s\n",i,arr[i]
  }
}