我有两个数据文件one.txt
和two.txt
Linux系统上。我想将所有正值转换为负值,one.txt
反之亦然two.txt
,但仅限于第一列。请注意,数据也包含零。
one.txt
是这样的:
10 35.74
8 35.74
6 35.74
4 35.74
2 35.74
0 35.74
Run Code Online (Sandbox Code Playgroud)
two.txt
像这样
-20 35.74
-18 35.74
-16 35.74
-14 35.74
-12 35.74
-0 35.74
Run Code Online (Sandbox Code Playgroud)
我想改成one.txt
这样:
-10 35.74
-8 35.74
-6 35.74
-4 35.74
-2 35.74
-0 35.74
Run Code Online (Sandbox Code Playgroud)
同样,我想将所有负值更改为正值 two.txt
我试过了,awk '$1 *= -1' file.txt
但它搞砸了零。
我需要在两个不同的进程中执行这两个问题。因此,我更喜欢为每个解决方案/代码提供两种不同的解决方案/代码,而不是一步完成
您尝试的轻微变体将起作用:
awk '{ $1 *= -1 } 1' file.txt
Run Code Online (Sandbox Code Playgroud)
问题awk '$1 *= -1'
在于$1 *= -1
它被视为一个条件;应用其效果,但随后将其作为条件,因此仅当结果非零时才输出处理过的行。
添加大括号会导致乘法应用于所有行,并且1
其自身会导致打印所有行。为了避免改变空行,你可以在乘法中添加一个条件:
awk 'NF { $1 *= -1 } 1' file.txt
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 Gawk¹,则可以在更改前检查第一列是否为数字:
awk 'typeof($1) == "strnum" { $1 *= -1 } 1' file.txt
Run Code Online (Sandbox Code Playgroud)
¹ 并且POSIXLY_CORRECT
环境中没有变量