带有 If 条件的 AWK

AWK with If condition

我正在尝试为 ex 替换以下字符串: 来自

['55',2,1,10,30,23],  

['55',2,555,10,30,23],

['55',2,1,10,30,23], 

['55',2,1,10,9999,23],

我四处搜索并找到这个:

$ echo "[55,2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="[55"){=10}{print}}'    

[55,10,1,10,30,23],

但在我的情况下它不起作用,因为在我的 if 条件中 $1 的值附近有“ '”:

$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="['55'"){=10}{print}}'

['55',2,1,10,30,23],

我想如何匹配和替换对你来说不是问题。您面临的问题是,如何在字段中匹配单引号 '

为了避免在代码中对每个 ' 进行转义,并使代码更具可读性,您可以将引号分配给一个变量,并在代码中使用该变量,例如:

echo "['55' 1
['56' 1"|awk -v q="'" '=="["q"55"q{++}7'
['55' 2
['56' 1

在上面的示例中,仅与 ['55' 一致,第 2 个字段递增。

问题不在 awk 代码中,而是 shell 扩展。单引号 shell 字符串中不能有单引号。当您尝试将输入字符串放入单引号时,这与您 运行 遇到的问题相同:

$ echo '['55',2,1,10,30,23],'
[55,2,1,10,30,23],

-- 单引号不见了!这是有道理的,因为他们完成了引用 [,2,1,10,30,23], 的工作(55 在这里没有被引用),但这不是我们想要的。

一个解决方案是分别引用它们之间的部分并手动将它们压缩:

$ echo '['\''55'\'',2,1,10,30,23],'
['55',2,1,10,30,23],

或者,在这种特殊情况下,单引号之间应该没有恶意,

echo '['\'55\'',2,1,10,30,23],'   # the 55 is now unquoted.

应用于您的 awk 代码,看起来像这样:

$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="['\'55\''"){=10}{print}}'
['55',10,1,10,30,23],

或者,如果您的代码中有很多单引号,这看起来不太好,您可以将 awk 代码写入文件,比如 foo.awk,然后使用

echo "['55',2,1,10,30,23]," | awk -F, -f foo.awk

那么您就不必担心 shell awk 代码中的引用错误,因为 awk 代码不再受到 shell 扩展的影响。