変数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