如何在每一行上用负数替换数字?

时间:2016-03-14 12:53:41

标签: perl awk sed

我有大量包含数字的文件,比如说

1.5 1.6 1.7
-5
2.1 2.8 -.3
4.005

并希望将其更改为

-1.5 -1.6 -1.7
-5
-2.1 -2.8 .3
4.005

即。在每隔一行替换所有数字的负值。我的意思是所有奇数行号。

有谁知道怎么做?将相关问题的答案结合起来并不适用于我。

4 个答案:

答案 0 :(得分:6)

Perl救援:

perl -lane '$. % 2 and $_ = -$_ for @F; print "@F"' input > output
  • -n逐行读取输入行
  • -a将每一行拆分为@F数组
  • -l添加了打印的换行符
  • $.包含行号,%是模运算符。每个奇数行$. % 2都是正确的。

答案 1 :(得分:4)

使用awk:

$ awk 'NR % 2 {for (i=1;i<=NF;++i) $i=-$i}1' oddneg.txt 
-1.5 -1.6 -1.7
-5
-2.1 -2.8 0.3
4.005

NR%2
仅当当前行号mod 2不为零时才执行此操作(即,对奇数行执行此操作)。

{for(i = 1; i&lt; = NF; ++ i)$ i = - $ i}
循环遍历列,将每个列设置为负值

<强> 1
打印当前(修改)的行。 (因为1的计算结果为true,awk惯用法有效,默认操作是打印当前行。)

答案 2 :(得分:1)

我建议这样做,通过在每个数字的开头添加或删除减号来起作用。任何不是数字的东西都不会受到影响

perl -pe's/(?<!\S)(-?)([\d.]+)/$1 ? $2 : "-$2" /ge if $. % 2' myfile.txt

输出

-1.5 -1.6 -1.7
-5
-2.1 -2.8 .3
4.005

答案 3 :(得分:0)

这可能适合你(GNU sed):

10.0.11.12

假设文件中的唯一值是数字。在每个数字的前面插入一个负号。如果有两个连续的负号,则原始号码为负数,因此请删除该符号。