在带有分隔符的shell变量上使用awk

时间:2018-01-24 00:19:44

标签: bash shell awk

我正在尝试将shell变量中的字符串作为输入并使用awk打印第二个单词

我不确定为什么这不起作用

ITEM="ABC DEF"
awk -v var=$ITEM -F ' ' '{ print $2 }'

结果应为DEF

4 个答案:

答案 0 :(得分:2)

if(len(conts)==3):
    if(pinchFlag==1):
        pinchFlag=0
        mouse.release(Button.left)
    mouse.release(Button.left)
    x1,y1,w1,h1 = cv2.boundingRect(conts[0])
    x2,y2,w2,h2 = cv2.boundingRect(conts[1])
    x3,y3,w3,h3 = cv2.boundingRect(conts[2])

    cv2.rectangle(frame,(x1,y1),(x1+w1,y1+h1),(255,0,0),2)
    cv2.rectangle(frame,(x2,y2),(x2+w2,y2+h2),(255,0,0),2)
    cv2.rectangle(frame,(x3,y3),(x3+w3,y3+h3),(255,0,0),2)

    cx1 = x1+w1/2
    cy1 = y1+h1/2
    cx2 = x2+w2/2
    cy2 = y2+h2/2
    cx3 = x3+w3/2
    cy3 = y3+h3/2

    #cx = (cx1+cx2)/2
    #cy = (cy1+cy2)/2
    #cz = (cx3+cx1)/2

    cv2.line(frame, (cx1,cy1),(cx2,cy2),(cx3,cy3),(255,0,0),2)

$ item="ABC DEF" $ awk '{print $2}' <<< "$item" DEF 是输入行的第二个字段。但没有任何意见。使用$2重定向<<<标准输入上的变量$item

使用awk时可能更容易理解:

echo

答案 1 :(得分:2)

$ ITEM="ABC DEF"
$ awk -v var="$ITEM" 'BEGIN{ split(var,a); print a[2] }'
DEF

但也要考虑:

$ a=( $ITEM )
$ echo "${a[1]}"
DEF

$ set -- $ITEM
$ echo "$2"
DEF

根据ITEM中的值,最后2个可能需要为globbing等进行清理。

答案 2 :(得分:1)

我相信这个任务可以通过参数扩展来完成,如下所示。

echo "${ITEM#* }"
DEF

当然,如果您有任何进一步的要求,那么其他程序也可以在这里考虑。

答案 3 :(得分:1)

正如PesaThe所解释的那样,您可以使用

$ echo "$item" | awk '{print $2}'
DEF

但我觉得使用awk打印变量的一部分是矫枉过正。 您可以寻求更简单的解决方案,例如cut命令:

$ echo "$item" | cut -d' ' -f2
DEF

您使用-d' '将分隔符定义为空格,然后使用-f2

选择第二个字段