将文本文件的第一列替换为 6 减去当前值

将文本文件的第一列替换为 6 减去当前值

我有以下文件,空格分隔

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

https://raku.org

相关内容