2017-07-22 17 views
0

私は単一の列ファイルを持っています。行の数は24の倍数です。行の総数は先験的に分かりません。私が送信するためにパイプを使用していますので、私は何をしようとしているawkを使って列ファイルを行列に変換する

は、私がAWKを使用したい

n = number_of_rows/24. 

サイズNX 24のマトリックスに単一の列を変換するためのawkを使用することです私はファイル全体の特定の列が必要なので、tarをawkに出力します。 SIGLEラインのすべての上記

23.0 
20.0 
17.0 
16.0 
16.0 
15.0 
18.0 
20.0 
23.0 
25.0 
27.0 
29.0 
30.0 
31.0 
32.0 
31.0 
30.0 
29.0 
27.0 
25.0 
23.0 
22.0 
20.0 
19.0 
23.0 
22.0 

、より多くの...

awk '{ 
for (r = 1; r <= 72; r++) { 
    for (c = 1; c <= 24; c++) { 
    a[r, c] = $1 
    } 
} 
} 
END { 
for (r = 1; r <= 72; r++) { 
    for (c = 1; c <= 24; c++) { 
    printf a[r, c] 
    } 
} 
}' myfile.dat 

MYFILE.DATのような山車が含まれています。

wc -l myfile.dat 

結果は、各エントリの繰り返しではなく行列である:私は以外の行の合計数を取得する方法を知らないので、私はテストするために数72を使用しています。

我々は入力列の各要素は、xからx [1]であることを考えると[N * 24]出力マトリックスが

x1 x2 x3 x4 ... x24 
x25 x26 x27 x28 ... x48 
x49 x50 x51 x52 ... x72 
... 
...     xn 

ないでなければならない、これは理にかなって? ご協力いただきありがとうございます。ペーストと標準入力からのデータと

答えて

1

も列の数を指定することができますどのprを使用することができます

$ seq 72 | pr -24ats' ' 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 


を必要と文句を言うpage width too narrowの、デフォルト72から式をページの幅を大きくする必要があるEXについて

を必要colは、列の数です(col-1)*len(delimiter) + colされています

$ # 99 is minimum width required for 50 columns with single character wide delimiter 
$ seq 100 | pr -J -w99 -50ats, 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 
51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 


を出力区切り文字は必要に応じてスペースでも使用することができます

< input xargs -d'\n' -n24 

-d'\n'入力ファイルの各行は、単一の引数として考えられるように

1

cat file | paste -d " " - - - - - - - - - - - - - - - - - - - - - - - - 

出力:pr場合

 
23.0 20.0 17.0 16.0 16.0 15.0 18.0 20.0 23.0 25.0 27.0 29.0 30.0 31.0 32.0 31.0 30.0 29.0 27.0 25.0 23.0 22.0 20.0 19.0 
23.0 22.0 
+0

ありがとう、すばらしいアプローチは、行数を定義する手間を省きます。どのようにダッシュを入力せずにそれを行うだろうか?とにかくそれは確かに問題の効率的な解決策です。どうもありがとう。 – Arraval

+1

@Arravalあなたは 'printf'トリックを使うことができます。' paste -d '' $(printf - ' - %.s' {1..24}) ' – Sundeep

+1

@Arraval:または' awk': 'catファイル| (i = 0; i Cyrus

0

awkを使ったもう1つのアプローチもここで使用できます。

awk -v divided_by=24 -v end=72 'BEGIN{for(value=1;value<=end;value++){printf("%d %s",value,value%divided_by==0?ORS:"")}}' 

ここではあまりにも多くのソリューションが追加されています。

awk -v divided_by=24 -v end=72 'BEGIN{ 
     for(value=1;value<=end;value++){ 
     printf("%d %s",value,value%divided_by==0?ORS:"") 
     }}' 
関連する問題