使用gawk转置列和行

使用gawk转置列和行,awk,row,transpose,gawk,Awk,Row,Transpose,Gawk,我正在尝试转置一个非常长的文件,我担心它不会被完全转置 我的数据如下所示: Thisisalongstring12345678 1 AB abc 937 4.320194 Thisisalongstring12345678 1 AB efg 549 0.767828 Thisisalongstring12345678 1 AB hi 346 -4.903441 Thisisalongstring12345678 1 AB jk 193 7.317946

我正在尝试转置一个非常长的文件,我担心它不会被完全转置

我的数据如下所示:

Thisisalongstring12345678   1   AB  abc 937 4.320194
Thisisalongstring12345678   1   AB  efg 549 0.767828
Thisisalongstring12345678   1   AB  hi  346 -4.903441
Thisisalongstring12345678   1   AB  jk  193 7.317946
Thisisalongstring12345678 Thisisalongstring12345678 Thisisalongstring12345678 Thisisalongstring12345678
1                         1                         1                         1
AB                        AB                        AB                        AB
abc                       efg                       hi                        jk
937                       549                       346                       193
4.320194                  0.767828                  -4.903441                 7.317946
我希望我的数据如下所示:

Thisisalongstring12345678   1   AB  abc 937 4.320194
Thisisalongstring12345678   1   AB  efg 549 0.767828
Thisisalongstring12345678   1   AB  hi  346 -4.903441
Thisisalongstring12345678   1   AB  jk  193 7.317946
Thisisalongstring12345678 Thisisalongstring12345678 Thisisalongstring12345678 Thisisalongstring12345678
1                         1                         1                         1
AB                        AB                        AB                        AB
abc                       efg                       hi                        jk
937                       549                       346                       193
4.320194                  0.767828                  -4.903441                 7.317946

第一个字符串的长度会成为一个问题吗?我的文件比这个长得多,大约有2000行。还可以将第一个字符串的名称更改为IS234,然后进行转置吗?

我不明白为什么不可以-除非您没有足够的内存。试试下面的方法,看看你是否遇到了问题

输入:

$ cat inf.txt 
a b c d
1 2 3 4
. , + -
A B C D
Awk计划:

$ cat mkt.sh
awk '
{
  for(c = 1; c <= NF; c++) {
    a[c, NR] = $c
  }
  if(max_nf < NF) {
    max_nf = NF
  }
}
END {
  for(r = 1; r <= NR; r++) {
    for(c = 1; c <= max_nf; c++) {
      printf("%s ", a[r, c])
    }
    print ""
  }
}
' inf.txt
学分:


希望这有帮助。

这可以通过
rs
BSD命令完成:


查看
-T
选项。

我尝试了icyrock.com的答案,但发现我必须更改:

for(r = 1; r <= NR; r++) {
  for(c = 1; c <= max_nf; c++) {
你会得到:

a 1 .
b 2 ,
c 3 +

i、 e.仍有3行4列(最后一行为空)。

对于@ScubaFishi和@icyrock代码:


“if(max_nf 类似于@ghoti Agree,这是一个类似的主题,不同的方法-OP有选择的好处!如果您愿意忍受每列20000*25个字符(或更多)的行(每行100 KiB或更多),并且您所使用的应用程序也是如此,那么
gawk
也可以接受。是的,您可以修剪长名称;设计算法并应用于输出或输入过程中。这很好:OSX中也有可用(库存)。它有很多特点。我建议阅读手册页。
a b c d
1 2 3 4
. , + -
a 1 .
b 2 ,
c 3 +