将所有正值更改为负值,反之亦然,但在两个不同的文件中

lin*_*ver -1 sed awk

我有两个数据文件one.txttwo.txtLinux系统上。我想将所有正值转换为负值,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但它搞砸了零。

我需要在两个不同的进程中执行这两个问题。因此,我更喜欢为每个解决方案/代码提供两种不同的解决方案/代码,而不是一步完成

Ste*_*itt 7

您尝试的轻微变体将起作用:

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环境中没有变量