n個の列を一緒に追加

n個の列を一緒に追加

変数yが空間(x)と時間(t)の関数にどのように変化するかを示す大規模なデータセットがあります。 n個の列があり、各列は時間ステップを表します。タブで区切られます。

注:実際のテキストファイルにはヘッダーがなく、説明のためにここに追加されました。また、出力にヘッダーを含めないでください。

x   y(0)   y(1)    y(2)    y(3) ... y(n)
1   4      4.5     5       5.5  ... 100
2   5      5.5     6       6.5  ... 101
3   7      8       9       10   ... 102
4   10     12      14      16   ... 103

t、x、yの3列のみを持つようにファイルを再構成する必要があります。この列は、次のように順番に並べる必要があります。

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
etc

どんな助けでも大変感謝します。私はawkを使用することがトリックを実行する必要があると思いますが、どんな解決策でも可能です。

答え1

牛に似た一種の栄養awk解決策:

awk '{
         k=NR; x[k]=$1;
         for (i=2; i<=NF; i++) 
             t[i-1][k]=$i 
     }
     END{
         for (i in t) 
             for (j in t[i]) 
                 print i-1, x[j], t[i][j] 
     }' file
  • k=NR- キキ反映機能 y軸値(NR-レコード数)
  • x[k]=$1- 軸の価値を捉えるx
  • for (i=2; i<=NF; i++)- 2番目のフィールドから繰り返し開始
    • t[i-1][k]=$i- 埋めるタイムラインtソート機能 y価値

出力:

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16
...

答え2

時間が経つにつれて繰り返しても問題ない場合は、次の手順を実行してくださいn

n=4   ### your N here
for((t=0; t <= n)); t++))
do 
  awk -F$'\t' -v t=$t '{print t, $1, $(t+2)}' < input
done > output

答え3

GNUの代替datamash+awk解決策:

datamash -W transpose <filename \
| awk 'NR==1{ for(i=1; i<=NF; i++) x[i]=$i }
       NR > 1{
           for (i=1; i<=NF; i++) print NR-2, x[i], $i 
       }'

出力:

0 1 4
0 2 5
0 3 7
0 4 10
1 1 4.5
1 2 5.5
1 3 8
1 4 12
2 1 5
2 2 6
2 3 9
2 4 14
3 1 5.5
3 2 6.5
3 3 10
3 4 16

関連情報