2013-09-23 53 views
2

您好我希望有人可以用问题帮助,猛砸用另一个字符串

我需要从一个文本文件中获取一定的值,并将其转换的东西整齐的文档输出代替空白和字符串的结尾。我有以下的代码来获得值:

values=$(awk '/PARAMETER/ {getline ; getline; print ($(NF-6))}' $array) 

这给我的字符串,例如:9.00 5.00 9.00

现在我想这个字符串转换为:9.0m,5.0m,9.0m。因此,请忽略第二个小数点并添加m,。值字符串的长度和值可能会有所不同,但始终有两位小数。

如何快速做到这一点!?

基本上这是我需要分析的文本。特别是我需要的子集1的一个Z值和子集2的一个Z值:

MODEL PARAMETERS : 
Project : Report 
Dataset : xxx 

Number of subsets : 2 
Total number   : 4 

Subset number : 1 
Subset name  : xxx_sub1 
Number   : 4 

NR TYPE      X(m)  Y(m) Z(m) Volume Pressure CluNo Activ Group 
--- --------------------- ------ ------ ----- ------- -------- ----- ----- ------ 
    1 Type text     0.00 -10.40 9.00 2000.0 500.0  0  0  1 
    2 Type text     0.00  -9.60 9.00 1000.0 500.0  0  1  1 
    3 Type text     3.00 -10.40 9.00 1200.0 500.0  1  1  1 
    4 Type text     3.00  -9.60 9.00 800.0 500.0  1  1  1 

Subset number : 2 
Subset name  : xxx_sub2 
Number   : 4 

NR TYPE      X(m)  Y(m) Z(m) Volume Pressure CluNo Activ Group 
--- --------------------- ------ ------ ----- ------- -------- ----- ----- ------ 
    1 Type text     0.00  10.40 15.00 2000.0 500.0  0  0  1 
    2 Type text     0.00  9.60 15.00 1000.0 500.0  0  1  1 
    3 Type text     3.00  10.40 15.00 1200.0 500.0  1  1  1 
    4 Type text     3.00  9.60 15.00 800.0 500.0  1  1  1 

Units : 
    Coordinates  : meter 
    Volume   : cubic cm 
    Pressure   : pascal 

回答

4
awk -v OFS="," '{for(i=1;i<=NF;i++)$i=sprintf("%.1fm",$i)}7' 

上面的一行可以帮助你。检查测试:

kent$ echo "2000.44 234.88 9.00 5.00 9.00"|awk -v OFS="," '{for(i=1;i<=NF;i++)$i=sprintf("%.1fm",$i)}7' 
2000.4m,234.9m,9.0m,5.0m,9.0m 
+0

感谢那些工作就像一种享受! 7是什么? – Cnoobplusplus

+0

我会讨厌awk awk。难道没有办法将OP的原始awk脚本折叠到这个awk脚本中来制作一个完整的awk程序吗? – kojiro

+0

@kojiro我也不会'awk | sed | awk | ....'。但OP只给了我们他的命令输出(awk)。我看不到他原来的输入。我只是根据他的输出做了一些工作。如果他提供了更多信息,应该是更好的解决方案。 – Kent

2

使用bashpaste

$ values="9.00 5.00 9.00" 
$ while IFS=, read val; do printf "%.1fm\n" $val; done <<< $values | paste -sd, 
9.0m,5.0m,9.0m 
$ values="1.1000 2.4 3.400 42" 
$ while IFS=, read val; do printf "%.1fm\n" $val; done <<< $values | paste -sd, 
1.1m,2.4m,3.4m,42.0m 
+0

为什么不只是'... printf%.1fm,'“$ val”;完成;回声'而不是粘贴?这不是纯粹的bash现在... – kojiro

+0

@kojiro因为它会添加尾随','。 – devnull

+0

@kojiro由于'粘贴'? – devnull