5

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

我的数据看起来像这样:

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 行长得多。也可以将第一个字符串的名称更改为Thisis234,然后转置吗?

4

4 回答 4

7

我不明白为什么它不会 - 除非你没有足够的内存。试试下面的,看看你是否遇到问题。

输入:

$ 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

跑:

$ ./mkt.sh 
a 1 . A 
b 2 , B 
c 3 + C 
d 4 - D 

学分:

希望这可以帮助。

于 2012-04-04T00:32:30.260 回答
6

这可以通过rsBSD 命令完成:

http://www.unix.com/man-page/freebsd/1/rs/

查看-T选项。

于 2012-04-04T02:30:28.453 回答
4

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

for(r = 1; r <= NR; r++) {
  for(c = 1; c <= max_nf; c++) {

for(r = 1; r <= max_nf; r++) {
  for(c = 1; c <= NR; c++) {

获取 NR 列和 max_nf 行。所以 icyrock 的代码变成了:

$ 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 <= max_nf; r++) {
    for(c = 1; c <= NR; c++) {
      printf("%s ", a[r, c])
    }
    print ""
  }
}
' inf.txt

如果您不这样做并使用不对称输入,例如:

a b c d
1 2 3 4
. , + -

你得到:

a 1 .
b 2 ,
c 3 +

即仍然是 3 行 4 列(最后一个是空白的)。

于 2015-01-23T00:51:42.493 回答
0

对于@ScubaFishi 和@icyrock 代码:

“如果(max_nf < NF)”似乎没有必要。我删除了它,代码工作得很好。

于 2017-02-25T03:15:37.663 回答