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 に答える
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 コードの場合:

「if (max_nf < NF)」は不要のようです。私はそれを削除しましたが、コードは問題なく動作します。

于 2017-02-25T03:15:37.663 に答える