我有大量包含数字的文件,比如说
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
即。在每隔一行替换所有数字的负值。我的意思是所有奇数行号。
有谁知道怎么做?将相关问题的答案结合起来并不适用于我。
答案 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
假设文件中的唯一值是数字。在每个数字的前面插入一个负号。如果有两个连续的负号,则原始号码为负数,因此请删除该符号。