将“n”列转换为行:

时间:2014-11-17 16:02:36

标签: awk

我想每隔3列将列转换为行。

INPUT.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

我已尝试过以下命令和in-complete

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

寻找你的建议......

1 个答案:

答案 0 :(得分:2)

有很多好的工具。

这个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中写了一段代码:

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)
              }
        }'
}