【问题标题】:Transpose till "n"th column into row:将直到第“n”列转换为行:
【发布时间】:2015-10-30 21:29:44
【问题描述】:

我想每 3 列将列转置为行。

输入.txt

Name
Age
Place
aa
22
xx
bb
33
yy
cc
44
zz
....
....

期望的输出

Name,Age,Place
aa,22,xx
bb,33,yy
cc,44,zz

我已经尝试了下面的命令并且不完整

awk '
{
  for(c = 1; c <= NR; c++)    { a[c]=$c }
}
END {
  for(r = 1; r <= NR; r++) {
    for(t = 1; t <= 3; t++) {
      printf("%s ", a[c])
    }
    print ","
  }
}'  Input.txt

正在寻找您的建议...

【问题讨论】:

    标签: awk


    【解决方案1】:

    有很多很好的工具。

    这个 awk!

    $ awk 'ORS=NR%3?",":RS' file
    Name,Age,Place
    aa,22,xx
    bb,33,yy
    cc,44,zz
    

    每当行不是 3 的倍数时,它将输出字段分隔符设置为 ,。这样,它将加入每组 3 行。

    Idiomatic awk 中的更多信息。

    xargs

    $ xargs -n3 <file
    Name Age Place
    aa 22 xx
    bb 33 yy
    cc 44 zz
    

    这将获取X 项目块中的输入,由-n X 定义。然后你可以用trsed替换逗号。

    粘贴

    $ paste -d"," - - - <file
    Name,Age,Place
    aa,22,xx
    bb,33,yy
    cc,44,zz
    

    这将连接每 3 个输入并使用分隔符 , 作为分隔符。


    关于转置本身,我前段时间在Using bash to sort data horizontally写了一个sn-p:

    transpose () {
      awk '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)}
            END {for (i=1; i<=max; i++)
                  {for (j=1; j<=NR; j++) 
                      printf "%s%s", a[i,j], (j<NR?OFS:ORS)
                  }
            }'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多