我有一个网格数据集,包含250行×300列矩阵形式:
ifile.txt
2 3 4 1 2 3
3 4 5 2 4 6
2 4 0 5 0 7
0 0 5 6 3 8
我想在第一列插入纬度值,在顶部插入经度值。看起来像:
ofile.txt
20.00 20.33 20.66 20.99 21.32 21.65
100.00 2 3 4 1 2 3
100.33 3 4 5 2 4 6
100.66 2 4 0 5 0 7
100.99 0 0 5 6 3 8
增量为0.33
我可以手动为小尺寸矩阵做这件事,但我无法知道如何以我想要的格式获得输出。我是用以下方式编写脚本的,但完全没用。
echo 20 > latitude.txt
for i in `seq 1 250`;do
i1=$(( i + 0.33 )) #bash can't recognize fractions
echo $i1 >> latitude.txt
done
echo 100 > longitude.txt
for j in `seq 1 300`;do
j1=$(( j + 0.33 ))
echo $j1 >> longitude.txt
done
paste longitude.txt ifile.txt > dummy_file.txt
cat latitude.txt dummy_file.txt > ofile.txt
答案 0 :(得分:1)
使用perl
$ perl -lane 'print join "\t", "", map {20.00+$_*0.33} 0..$#F if $.==1;
print join "\t", 100+(0.33*$i++), @F' ip.txt
20 20.33 20.66 20.99 21.32 21.65
100 2 3 4 1 2 3
100.33 3 4 5 2 4 6
100.66 2 4 0 5 0 7
100.99 0 0 5 6 3 8
-a
在空格上自动拆分输入,结果保存在@F
数组中
if $.==1
表示第一行输入
map {20.00+$_*0.33} 0..$#F
根据@F
数组的大小进行迭代,对于每次迭代,我们根据{}
中的等式得到一个值$_
将0
},1
等等到@F
数组print join "\t", "", map...
使用制表符分隔符打印空元素和地图结果@F
数组的内容预先固定,结果为100+(0.33*$i++)
,其中$i
在数字上下文中最初为0
。同样,tab在连接这些值时用作分隔符
如果需要格式化,请使用sprintf
,也可以初始化$,
而不是使用join
perl -lane 'BEGIN{$,="\t"; $st=0.33}
print "", map { sprintf "%.2f", 20+$_*$st} 0..$#F if $.==1;
print sprintf("%.2f", 100+($st*$i++)), @F' ip.txt