使用 awk 有条件地更改字段值

使用 awk 有条件地更改字段值

我的文件中有以下值。

user1 India GJ 1000 IT contractor
user2 Ind GJ 1001 HR contractor
user3 USA CA 1002 R&D hourly
user4 India TN 1003 R&D fte
user5 Ind KA 1004 FE fte
user6 In GJ 2345 HR hourly

需要匹配第 3 列并更新第 2 列。我可以使用以下命令来完成。

awk -i inplace '/GJ|TN|KA/ {$2="IN"} {print}' filename

上述命令的输出是

user1 IN GJ 1000 IT contractor
user2 IN GJ 1001 HR contractor
user3 USA CA 1002 R&D hourly
user4 IN TN 1003 R&D fte
user1 IN GJ 1000 IT contractor
user5 IN KA 1004 FE fte
user6 IN GJ 2345 HR hourly

但当我通过 ssh 运行时,同样的方法不起作用

ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2="IN"} {print}" filename

SSH 上的输出

user1  GJ 1000 IT contractor
user2  GJ 1001 HR contractor
user3 USA CA 1002 R&D hourly
user4  TN 1003 R&D fte
user1  GJ 1000 IT contractor
user5  KA 1004 FE fte
user6  GJ 2345 HR hourly

不确定我遗漏了什么,以及为什么它不能在我们的 SSH 上运行。我愿意接受任何其他解决方案。

谢谢。

答案1

发生了什么

您的命令

ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2="IN"} {print}'" filename

(请注意,我添加了缺失的';如果没有它awk根本无法运行)

不会执行您想要的操作,因为本地 shell 会删除所有双引号。请看:

          ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2="IN"} {print}'" filename
quoted:                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^
unquoted: ^^^^^^^^^^^^^^^                                  ^^            ^^^^^^^^^

实际上ssh获取awk -i inplace '/GJ|TN|KA/ {$2=IN} {print}'filename(作为单独的参数)。它构建以下命令在远程端运行:

awk -i inplace '/GJ|TN|KA/ {$2=IN} {print}' filename

这意味着awk执行

/GJ|TN|KA/ {$2=IN} {print}

其中IN不被视为字符串,它是 中的变量awk。该变量为空。


解决方案

为了使“内部”双引号保留下来并到达远程 shell(并awk最终到达),请像对以下内容进行转义$

ssh -q server1 "awk -i inplace '/GJ|TN|KA/ {\$2=\"IN\"} {print}'" filename

更多信息:

相关内容