2012-04-04 4 views
4

非常に長いファイルを転置しようとしていますが、転置されないことが心配です。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 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に変更して、転置することもできますか?

+0

カラムあたり20,000 * 25文字(つまり100 KiBほど)の行を置いていて、あなたが扱うアプリケーションもあまりにも多い場合は、 'gawk 'それでもうまくいくでしょう。はい、あなたは長い名前をトリミングすることができます。アルゴリズムを考案し、出力または入力中に適用する。 –

答えて

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 

クレジット:

希望します。

+0

[コマンドラインピボット]に似ています(http://stackoverflow.com/questions/9475806/command-line-pivot) – ghoti

+0

@ghoti同意、それは類似したトピックです。 –

4

これはrs BSDコマンドで行うことができます。

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

-Tオプションをチェックしてください。

+0

これは素晴らしいです:また、OSXで利用可能(株)です。多くの機能があります。マニュアルページを読むことをお勧めします。 – Vincent

3

私は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を列(最後は空白です)。 @ ScubaFishiの場合とicyrockコード@

0

"(max_nf < NF)であれば" 不要と思われます。私はそれを削除し、コードは正常に動作します。

関連する問題