使用awk用逗号连接值

时间:2014-01-04 05:13:06

标签: awk

我正在尝试使用UNIX中的Process id为SQL语句生成WHERE子句。

spid=$(ps -ef|grep "LOCAL=NO"|awk {'print $2'})
for (( i=0; i<${#spid[@]}; i++ ))  
do 
    if [ ${i} -eq 0 ]; then 
        where="'${spid[$i]}'"; 
    else 
        where=${where}", '${spid[$i]}'";
    fi 
done

echo $where

预期的输出

'45674','4757','34535' 

当前输出

'45674,4757,34535'

1 个答案:

答案 0 :(得分:3)

您缺少一组括号,因此spid的赋值是创建单个字符串,而不是数组。使用:

spid=( $(ps -ef|grep "LOCAL=NO"|awk {'print $2'}) )
for (( i=0; i<${#spid[@]}; i++ ))  
do 
    if [ ${i} -eq 0 ]; then 
        where="'${spid[$i]}'"; 
    else 
        where=${where}", '${spid[$i]}'";
    fi 
done

echo $where

=( ... )符号,其中空间在技术上不是必需的,定义了数组赋值。

我唯一不清楚的是嵌入式逗号的来源。您的预期输出应包含一些空格,因为您的连接操作包含空格。

如果是我的代码,我会修复相当多的小间距和引用问题:

spid=( $(ps -ef | awk '/LOCAL=NO/ {print $2}') )
for (( i = 0; i < ${#spid[@]}; i++ ))  
do 
    if [ ${i} -eq 0 ]; then 
        where="'${spid[$i]}'"
    else
        where="$where, '${spid[$i]}'"
    fi
done

echo "$where"

或者,更有可能的是,我也失去了if

spid=( $(ps -ef | awk '/LOCAL=NO/ {print $2}') )
pad=""
for (( i = 0; i < ${#spid[@]}; i++ ))  
do 
    where="$where$pad'${spid[$i]}'"
    pad=", "
done
echo "$where"

awk生成所有输出:

ps -ef |
awk '/LOCAL=NO/ { printf("%s'\''%s'\''", pad, $2; pad=", "} END { printf "\n" }'

唯一的拼图是'\''序列出现两次;这是在单引号字符串中嵌入单引号的规范方法。第一个单引号终止单引号字符串的当前段;反斜杠单引号嵌入单引号,另一单引号启动单引号字符串的下一段。同样,还有其他方法可以做到这一点,但使用双引号比使用单引号更难。