0

「mm/yyyy、data」形式で次のような入力データがあります。

Location 1
08/2012, 44.1
09/2012, 34.2
10/2012, 24.3
11/2012, 14.4
12/2012, 04.5
01/2013, 14.6
02/2013, 24.7
Location 2
08/2012, 33.1
09/2012, 44.2
10/2012, 55.3
11/2012, 66.4
12/2012, 77.5
01/2013, 88.6
02/2013, 11.7
Location 3
08/2012, 35.1
09/2012, 45.2
10/2012, 55.3
11/2012, 66.4
12/2012, 77.5
01/2013, 71.6 
02/2013, 19.7
Location 4
etc
etc

そして私はこれであるawkスクリプトを使用しています-

awk'} printf(NR%276 == 0)?$ 0 "\ n":$ 0 "\ t"}'入力ファイル(上記の一部に示されている元のデータの新しい繰り返し列または「場所」ごとの列の長さであるため、NR%276を使用しています)。Awkは、単一列のデータのチャンクを「場所X」から「場所Y」までのn列の出力に分割できますか?

出力を取得していますが、単一の列の入力ファイルからの出力をテキストラップ方式で水平方向に実行するか、次のように「スネーク」するのは正しくありません-場所1 mm / yyyy、data1data2など場所2mm / yyyy、data1data2など場所3 mm / yyyy、data1data2など。

代わりに、これに似た出力データが必要ですが、276行と約150列/場所、または入力ファイルの276行の「場所」データの最後の単一列チャンク(上記の短縮例)です。たとえば、2013年3月の場合は行数を277に増やしたり、150を超える場所に増やしたりすると便利です。

Location 1        Location 2        Location 3
08/2012, 44.1     08/2012, 33.1     08/2012, 35.1
09/2012, 34.2     09/2012, 44.2     09/2012, 45.2
10/2012, 24.3     10/2012, 55.3     10/2012, 55.3
11/2012, 14.4     11/2012, 66.4     11/2012, 66.4
12/2012, 04.5     12/2012, 77.5     12/2012, 77.5
01/2013, 14.6     01/2013, 88.6     01/2013, 71.6
02/2013, 24.7     02/2013, 11.7     02/2013, 19.7

ありがとうございました!!

4

3 に答える 3

1

各場所に同じ数のデータ行があると仮定します。

numcols=$(tac input_file | awk '$1 == "Location" {print $2; exit}')
pr -t -s --columns=$numcols input_file

各場所の行数がわかっているので、次の方法で場所の数を計算します。

numcols=$(( $(wc -l < input_file) / 277 ))
于 2013-03-18T18:47:37.240 に答える
1

このワンライナーを試してください:

 awk '/^Location/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file

ノート

  • 上記の行は、1 列の入力を 3 列の出力に変換しますが、処理しませんでし276 rowsた。(その計算をする必要はないと思います。)
  • 出力では、列がtab分離されています。
  • 行と列はハードコーディングされていないため、実際のデータでテストできます

あなたのデータでテストしてください:

kent$  awk '/^Location/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file      
Location 1      Location 2      Location 3
08/2012, 44.1   08/2012, 33.1   08/2012, 35.1
09/2012, 34.2   09/2012, 44.2   09/2012, 45.2
10/2012, 24.3   10/2012, 55.3   10/2012, 55.3
11/2012, 14.4   11/2012, 66.4   11/2012, 66.4
12/2012, 04.5   12/2012, 77.5   12/2012, 77.5
01/2013, 14.6   01/2013, 88.6   01/2013, 71.6 
02/2013, 24.7   02/2013, 11.7   02/2013, 19.7

コメントの編集

 awk '!/^[0-9]/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=277&&m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file 
  • 上記の行は、ハードコードされた「場所」には一致しませんが、数字以外のタイトルには一致します (「場所」でも機能します)。
  • 276、277 意味がわかりません。ただし、上記のワンライナーは各ブロック (例の場所) に対して最大 276 行を出力します。行番号が 276 未満の場合は、実際の行数を表示するだけです。

ニーズに合わせて、ワンライナーを少し調整できます。

幸運を。

于 2013-03-18T17:41:40.697 に答える
0

別の awk を試すことができます:

awk '!/^[0-9]/{n=0} {n++; A[n]=A[n] (A[n]?OFS:x) $0} END{for(i=1; i<=n; i++) print A[i]}' OFS='\t' file

各位置で 2 番目の列のみを印刷するには:

awk '!/^[0-9]/{n=0} {n++; A[n]=A[n] (A[n]?OFS:x) $2} END{for(i=1; i<=n; i++) print A[i]}' OFS='\t' file
于 2013-03-18T22:10:01.693 に答える