awk - 舍入多行文本文件中的所有浮点数
awk - Rounding all floating-point numbers in multi-line text file
假设一个多行文本文件,每行包含多个浮点数以及字母数字字符串和特殊字符。唯一的一致性是所有浮点数都通过一个空格与任何其他字符串分隔开。此外,假设我们希望将 each 个浮点数四舍五入到逗号后最多 n 位。除浮点数之外的所有字符串应保持 原样 和 原样 。让我们假设n=5。
我知道这可以通过 awk 轻松实现。我当前的代码(如下)仅舍入每行的最后一个浮点数并吞下它之前的所有字符串。我该如何改进它?
echo -e "\textit{foo} & 1234.123456 & -1234.123456\n1234.123456" |\
awk '{for(i=1;i<=NF;i++);printf("%.05f\n",$NF)}'
# -1234.12346
# 1234.12346
一个解决方案:
$ echo -e "\textit{foo} & 1234.123456 & -1234.123456\n1234.123456" |
awk '{for(i=1;i<=NF;i++){if ($i ~ /[0-9]+.[0-9]+/){printf "%.05f\n", $i}}}'
输出:
1234.12346
-1234.12346
1234.12346
使用perl:
perl -i -pe 's/(\d+\.\d+)/sprintf "%.05f", /eg' file
这是你想要做的吗?
$ printf '\textit{foo} & 1234.123456 & -1234.123456\n1234.123456\n' |
awk -F'[ ]' '{for(i=1;i<=NF;i++) if ($i+0 == $i) $i = sprintf("%.05f",$i)} 1'
extit{foo} & 1234.12346 & -1234.12346
1234.12346
if ($i+0 == $i)
是测试值是否为数字的惯用 awk 方法,因为只有数字在该比较的左侧和右侧可能具有相同的值。
我将 FS
设置为文字的单个空白字符而不是默认值,令人困惑的是,它也是一个空白字符,但后者(即 ' '
与 '[ ]'
) 被特殊对待,导致所有连续的白色链 space 被视为分隔符并忽略在重新编译 [=15=]
时剥离 leading/trailing 空白(例如,由于分配给任何字段) 因此不允许在输出中保留您的格式。
假设一个多行文本文件,每行包含多个浮点数以及字母数字字符串和特殊字符。唯一的一致性是所有浮点数都通过一个空格与任何其他字符串分隔开。此外,假设我们希望将 each 个浮点数四舍五入到逗号后最多 n 位。除浮点数之外的所有字符串应保持 原样 和 原样 。让我们假设n=5。
我知道这可以通过 awk 轻松实现。我当前的代码(如下)仅舍入每行的最后一个浮点数并吞下它之前的所有字符串。我该如何改进它?
echo -e "\textit{foo} & 1234.123456 & -1234.123456\n1234.123456" |\
awk '{for(i=1;i<=NF;i++);printf("%.05f\n",$NF)}'
# -1234.12346
# 1234.12346
一个解决方案:
$ echo -e "\textit{foo} & 1234.123456 & -1234.123456\n1234.123456" |
awk '{for(i=1;i<=NF;i++){if ($i ~ /[0-9]+.[0-9]+/){printf "%.05f\n", $i}}}'
输出:
1234.12346
-1234.12346
1234.12346
使用perl:
perl -i -pe 's/(\d+\.\d+)/sprintf "%.05f", /eg' file
这是你想要做的吗?
$ printf '\textit{foo} & 1234.123456 & -1234.123456\n1234.123456\n' |
awk -F'[ ]' '{for(i=1;i<=NF;i++) if ($i+0 == $i) $i = sprintf("%.05f",$i)} 1'
extit{foo} & 1234.12346 & -1234.12346
1234.12346
if ($i+0 == $i)
是测试值是否为数字的惯用 awk 方法,因为只有数字在该比较的左侧和右侧可能具有相同的值。
我将 FS
设置为文字的单个空白字符而不是默认值,令人困惑的是,它也是一个空白字符,但后者(即 ' '
与 '[ ]'
) 被特殊对待,导致所有连续的白色链 space 被视为分隔符并忽略在重新编译 [=15=]
时剥离 leading/trailing 空白(例如,由于分配给任何字段) 因此不允许在输出中保留您的格式。