我有一个文本文件,结构如下:
293.0 2305.3 1508.0
2466.3 1493.0
2669.5 1578.6
3497.2 1768.9
4265.5 2092.4
5940.8 2558.6
7308.7 3015.4
9377.7 3814.6
295.0 2331.4 1498.1
3617.0 1893.2
我仍然是Linux的新手,无论如何它都像下面的例子一样输出:
293.0 2305.3 1508.0
293.0 2466.3 1493.0
293.0 2669.5 1578.6
293.0 3497.2 1768.9
293.0 4265.5 2092.4
293.0 5940.8 2558.6
293.0 7308.7 3015.4
293.0 9377.7 3814.6
295.0 2331.4 1498.1
295.0 3617.0 1893.2
所以基本上,我希望它复制,直到它遇到另一个变量。
如果row包含三列,请将第一列保存到变量并打印所有三列。如果row包含两列,则打印变量以及第一列和第二列:
awk 'NF==3{c=$1; print $1,$2,$3}; NF==2{print c,$1,$2}' file
输出:
293.0 2305.3 1508.0 293.0 2466.3 1493.0 293.0 2669.5 1578.6 293.0 3497.2 1768.9 293.0 4265.5 2092.4 293.0 5940.8 2558.6 293.0 7308.7 3015.4 293.0 9377.7 3814.6 295.0 2331.4 1498.1 295.0 3617.0 1893.2
您还可以使用以下命令:
$ sed 's/ \+/|/g' dupl.in | awk 'BEGIN{FS="|"}{if($1){buff=$1; printf "%.1f ", buff;} else {printf "%.1f ", buff;} printf "%1.f %1.f \n",$2, $3}'
293.0 2305 1508
293.0 2466 1493
293.0 2670 1579
293.0 3497 1769
293.0 4266 2092
293.0 5941 2559
293.0 7309 3015
293.0 9378 3815
295.0 2331 1498
295.0 3617 1893
由于其阵列容量,您还可以使用纯bash样式:
$ while read -a f; do \
if [ ! -z ${f[2]} ]; then \
c=${f[0]}; echo ${f[@]}; \
else \
echo $c ${f[@]}; \
fi; \
done <file
我为了阅读目的而剪了一条线。
逐行(读取时),我将字段保存在数组“f”中。如果第三个字段不为空(如果[!-z ...]),我保存第一列并打印所有字段,否则,我打印c和其他2个字段。