如何将字符串复制到bash中的另一个字符串

问题描述 投票:2回答:3

我有一个文本文件,结构如下:

 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           

所以基本上,我希望它复制,直到它遇到另一个变量。

linux bash unix
3个回答
5
投票

使用Barmar's idea

如果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

0
投票

您还可以使用以下命令:

$ 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

0
投票

由于其阵列容量,您还可以使用纯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个字段。

© www.soinside.com 2019 - 2024. All rights reserved.