2016-02-27 48 views
3
cat list.txt 

1 apple 4 30 f 2 potato 2 40 v 3 orange 5 10 f 4 grapes 10 8 f 重定向到一个变量存储AWK在bash

脚本:的GetList ::

if [[ "[email protected]" == *[f]* ]] ; then 
    awkv1 = $(grep f | awk '{ print $2 $3 }') 
else 
    awkv1 = $(awk '{ print $2 $4 $5 }') 
fi 

cat list.txt | $(awkv1) 

我有一个可变awkv1存储取决于参数 'F' 的值。 但它不工作。 跑步:: getlist f不会做任何事情。

它应该像这样:: 如果“F”的参数传递,然后:: cat list.txt | grep f | awk '{ print $2 $3 }'

否则:: cat list.txt | awk '{ print $2 $4 $5 }'

+0

如果另一列匹配'F'?假设你在第二列中有一个“水果”,但在末尾而不是“f”处有“v”。 – e0k

+0

我想问一下,我有这个'awkv1'变量,它的值取决于条件。但重定向到'awkv1'变量存储awk命令不起作用。 'cat list.txt | $(awkv1)' – jonny789

+0

你真的想做什么?我看到的所有或大部分内容都可以在一个简单的awk调用中完成。 – e0k

回答

1

在一个字符串变量存储部分命令行是容易出错的更好的使用bash一个rrays。

你可以调整你的脚本是这样的:

#!/bin/bash 

# store awk command line in an array 
if [[ "$*" == *f* ]]; then 
    awkcmd=(awk '/f/{ print $2, $3 }') 
else 
    awkcmd=(awk '{ print $2, $4, $5 }') 
fi 

# execute your awk command 
"${awkcmd[@]}" list.txt 
+1

完美工作。 :) – jonny789

1

有一些你需要在你的脚本进行更正:

awkv1 = $
  • 代替grep f使用grep 'f$'
    1. 删除空格。该方法仅与最后一列中的字符f相匹配,并避免带有字母f的水果,例如, 无花果,当最后一个柱v.
    2. 结束自前一命令的输出已经被存储在所述可变$awkv1echo "$awkv1"通过更换cat list.txt | $(awkv1)被匹配。

    脚本的修正版本:

    if [[ "[email protected]" == *[f]* ]] ; then 
        awkv1=$(grep 'f$' | awk '{ print $2, $3 }') 
    else 
        awkv1=$(awk '{ print $2, $4, $5 }') 
    fi 
    
    echo "$awkv1" 
    

    您可以调用这个脚本是这样的:cat list.txt | getlist f

  • +0

    但是它将如何从list.txt中读取数据。代码中没有提到list.txt文件。 – jonny789

    +0

    因为可以这样调用脚本,所以不需要在脚本中提及'list.txt':'cat list.txt | ./getlist f' –

    1

    为什么不这样做:

    文件:的GetList

    #!/bin/sh 
    if [ "$1" = "f" ]; then 
        awk '$5=="f"{print $2,$3}' list.txt 
    else 
        awk '{print $2,$4,$5}' list.txt 
    fi 
    

    如果该文件是可执行文件,你可以这样调用它:

    $ ./getlist f 
    apple 4 
    orange 5 
    grapes 10 
    $ ./getlist 
    apple 30 f 
    potato 40 v 
    orange 10 f 
    grapes 8 f 
    $ 
    

    或者,如果你想在命令行指定的搜索值:

    #!/bin/sh 
    if [ "$1" ]; then 
        awk -v t="$1" '$5==t{print $2,$3}' list.txt 
    else 
        awk '{print $2,$4,$5}' list.txt 
    fi 
    

    这种方式,你可以列出标记域fv

    $ ./getlist 
    apple 30 f 
    potato 40 v 
    orange 10 f 
    grapes 8 f 
    $ ./getlist f 
    apple 4 
    orange 5 
    grapes 10 
    $ ./getlist v 
    potato 2 
    $ 
    
    +0

    好的方法!这是非常可读和更全面的方式。 –

    +0

    是的,有很多方法可以做到这一点。但我想要使用重定向到具有awk命令的变量来执行此操作。 – jonny789