具有If条件的AWK

时间:2015-01-21 09:30:45

标签: linux unix awk command

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

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

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

OR

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

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

我四处寻找并发现:

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

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

但它不适用于我的情况,因为有" ' "在我的if条件中,价值为1美元左右:

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

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

2 个答案:

答案 0 :(得分:1)

问题不在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($1=="['\'55\''"){$2=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扩展的影响。

答案 1 :(得分:0)

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

为避免逃避代码中的每个',并使代码更具可读性,您可以将引用赋予变量,并在代码中使用该变量,例如:

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

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