我有一个大型数据集,它显示变量 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
我需要重新组织我的文件,这样我就只有 3 列; t、x、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
etc
非常感谢任何帮助。我觉得使用 awk 应该可以做到这一点,但任何解决方案都可以。
答案1
GNUawk
解决方案:
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++)
- 从第二个字段开始迭代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
替代 GNUdatamash
+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