Replace awk/sed将分号分隔文件中的正值转换为负值

Replace awk/sed将分号分隔文件中的正值转换为负值,replace,sed,awk,gsub,Replace,Sed,Awk,Gsub,我有一个这样构建的文件: 1233;mc3; limit;1 946;mc3; limit;14545 0843;mc3; limit;2 443;mc3;Short ;1012 1309;mc3;Short ;1 1247;mc3;Short ;1121 989;mc3;Short ;1 1340;mc3;Short ;14545 170;mc3;Short limit;1 105964;mc3; rep;2000000 4934;mc3; rep;1 3028;mc3; rep;

我有一个这样构建的文件:

1233;mc3; limit;1
946;mc3; limit;14545
0843;mc3; limit;2
443;mc3;Short  ;1012
1309;mc3;Short  ;1
1247;mc3;Short  ;1121
989;mc3;Short  ;1
1340;mc3;Short  ;14545
170;mc3;Short  limit;1
105964;mc3; rep;2000000
4934;mc3; rep;1
3028;mc3; rep;14545
awk -F\; '{$4=0-$4}8' OFS=\; file
1233;mc3; limit;-1
946;mc3; limit;-14545
0843;mc3; limit;-2
443;mc3;Short  ;-1012
1309;mc3;Short  ;-1
1247;mc3;Short  ;-1121
989;mc3;Short  ;-1
1340;mc3;Short  ;-14545
170;mc3;Short  limit;-1
105964;mc3; rep;-2000000
4934;mc3; rep;-1
3028;mc3; rep;-14545
我唯一能确定的是,每件事都是“;”分开

我想将第四列中的值编辑为负值。在文件中,此值始终为正值

到目前为止,我想到的是:

[usr@serv] cat list | awk -F";" '{gsub ("^","-",$4);print}'
123213 mc  limit -1
946 mc  limit -14545
08743 mc  limit -2
4493 mc Short   -1012
13009 mc Short   -1
12147 mc Short   -1121
9989 mc Short   -1
13490 mc Short   -14545
1780 mc Short  limit -1
1054964 mc  rep -2000000
49324 mc  rep -1
30828 mc  rep -14545
但正如您所看到的,它删除了“;”。我做错了什么


我是否使用awk或sed,或者是否编辑原始文件或将其打印到新文件,这对我来说并不重要。我只想转换第三个“;”后面的值

您缺少设置为
的OFS
。您也可以这样做:

1233;mc3; limit;1
946;mc3; limit;14545
0843;mc3; limit;2
443;mc3;Short  ;1012
1309;mc3;Short  ;1
1247;mc3;Short  ;1121
989;mc3;Short  ;1
1340;mc3;Short  ;14545
170;mc3;Short  limit;1
105964;mc3; rep;2000000
4934;mc3; rep;1
3028;mc3; rep;14545
awk -F\; '{$4=0-$4}8' OFS=\; file
1233;mc3; limit;-1
946;mc3; limit;-14545
0843;mc3; limit;-2
443;mc3;Short  ;-1012
1309;mc3;Short  ;-1
1247;mc3;Short  ;-1121
989;mc3;Short  ;-1
1340;mc3;Short  ;-14545
170;mc3;Short  limit;-1
105964;mc3; rep;-2000000
4934;mc3; rep;-1
3028;mc3; rep;-14545

您缺少设置为
的OFS
。您也可以这样做:

1233;mc3; limit;1
946;mc3; limit;14545
0843;mc3; limit;2
443;mc3;Short  ;1012
1309;mc3;Short  ;1
1247;mc3;Short  ;1121
989;mc3;Short  ;1
1340;mc3;Short  ;14545
170;mc3;Short  limit;1
105964;mc3; rep;2000000
4934;mc3; rep;1
3028;mc3; rep;14545
awk -F\; '{$4=0-$4}8' OFS=\; file
1233;mc3; limit;-1
946;mc3; limit;-14545
0843;mc3; limit;-2
443;mc3;Short  ;-1012
1309;mc3;Short  ;-1
1247;mc3;Short  ;-1121
989;mc3;Short  ;-1
1340;mc3;Short  ;-14545
170;mc3;Short  limit;-1
105964;mc3; rep;-2000000
4934;mc3; rep;-1
3028;mc3; rep;-14545

不需要
$4=0-$4
$4=-$4
就足够了。+1,公认的答案有效,看起来很酷,但是这一行(远)比那一行好。此awk行仅处理文件一次。另一个在3个过程中进行3次。如果输入和问题一样小,就可以了。然而,当你点击一个大文件时……不需要
$4=0-$4
$4=-$4
就足够了。+1,公认的答案有效,看起来很酷,但是这一行比那一行(好得多)。此awk行仅处理文件一次。另一个在3个过程中进行3次。如果输入和问题一样小,就可以了。然而,当你碰到一个大文件时……哦,这很聪明+1.对于可以读取文件本身的命令,不应使用
cat
<代码>修订文件名| sed的/;/-;/'|rev
,加上654分,你应该知道如何使用代码标签。你说得对,jotne,相应地修改了我的答案。谢谢。哦,真聪明+1.对于可以读取文件本身的命令,不应使用
cat
<代码>修订文件名| sed的/;/-;/'|rev
,加上654分,你应该知道如何使用代码标签。你说得对,jotne,相应地修改了我的答案。谢谢