发布
社区首页 >问答首页 >使用awk用逗号连接值

使用awk用逗号连接值
EN

Stack Overflow用户
提问于 2014-01-04 05:13:06
回答 1查看 57关注 0票数 1

我试图使用UNIX的进程id为SQL语句生成WHERE子句。

代码语言:javascript
代码运行次数:0
复制
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

预期产出

代码语言:javascript
代码运行次数:0
复制
'45674','4757','34535' 

电流输出

代码语言:javascript
代码运行次数:0
复制
'45674,4757,34535'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-04 06:27:27

您缺少了一组括号,因此分配给spid的任务是创建单个字符串,而不是数组。使用:

代码语言:javascript
代码运行次数:0
复制
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

在技术上不需要空格的=( ... )表示法定义了数组赋值。

我唯一不清楚的是嵌入的逗号是从哪里来的。您的预期输出应该包括一些空格,因为您的级联操作包含一个空格。

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

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
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生成所有输出:

代码语言:javascript
代码运行次数:0
复制
ps -ef |
awk '/LOCAL=NO/ { printf("%s'\''%s'\''", pad, $2; pad=", "} END { printf "\n" }'

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20917242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档