我有以下文件,空格分隔
2.5 235215 3.1925
3.7 125255 1.3125
我需要将第一列更改为 6 减去当前值。期望的结果是
3.5 235215 3.1925
2.3 125255 1.3125
如何使用 Bash 脚本执行此操作?
我试过
$KMAX=6
sed -E "s/^(([^ ]+ +){3})$1 /\1$KMAX-$1 /" $1
答案1
使用以下方法可以轻松解决该任务awk
:
awk -v kmax=6 '{$1=kmax-$1}1' file.txt
- 这会将值导入
6
到一个awk
变量中kmax
,然后可以在内部使用。 - 程序将
$1
用 的算术结果替换第一列kmax-$1
。 1
动作块之外看似“杂散”的结果是打印当前行,包括所做的所有修改。
需要注意的是:对于空间分隔的列,awk
只会使用一空格作为输出上的分隔符,因此结果将是您的情况:
3.5 235215 3.1925
2.3 125255 1.3125
答案2
使用乐(以前称为 Perl_6)
~$ raku -ne 'given .split( / \s+ /) { put join "\t", (6 - .[0], .[1..*]) };'
或者:
~$ raku -ne 'given .split( / \s+ /) { join("\t", (6 - .[0], .[1..*])).put };'
Raku 是 Perl 系列编程语言。使用 Raku 的一个优点是它可以轻松处理单行代码,如果您需要进行更严格的 CSV 处理,您可以使用模块(例如Text::CSV
)。
上面的代码是使用-ne
非自动打印、逐行标志调用的。该given
关键字告诉 Raku 将输入视为一项(一行),同时split
使用空格。在该块内,从第一个元素中减去 6 .[0]
,并将结果与.[1..*]
其余元素一起放入列表中。最后,打印输出put
。
输入示例:
2.5 235215 3.1925
3.7 125255 1.3125
示例输出:
3.5 235215 3.1925
2.3 125255 1.3125