cat list.txt
1 apple 4 30 f
2 potato 2 40 v
3 orange 5 10 f
4 grapes 10 8 f
脚本:getlist ::
if [[ "$@" == *[f]* ]] ; then
awkv1 = $(grep f | awk '{ print $2 $3 }')
else
awkv1 = $(awk '{ print $2 $4 $5 }')
fi
cat list.txt | $(awkv1)
我有一个变量awkv1,它根据参数'f'存储值。
但它没有用。
Running :: getlist f
没有做任何事情。
它应该像这样工作::
如果'f'在参数中传递,则:: cat list.txt | grep f | awk '{ print $2 $3 }'
否则:: cat list.txt | awk '{ print $2 $4 $5 }'
答案 0 :(得分:1)
您需要在脚本中执行一些更正:
awkv1 = $
grep f
使用grep 'f$'
。此方法仅匹配最后一列中的字符f
,并避免带有字母f
的水果,例如 fig ,在最后一列以v.
cat list.txt | $(awkv1)
替换为echo "$awkv1"
,因为上一个命令的输出已存储在变量$awkv1
中。更正后的脚本版本:
if [[ "$@" == *[f]* ]] ; then
awkv1=$(grep 'f$' | awk '{ print $2, $3 }')
else
awkv1=$(awk '{ print $2, $4, $5 }')
fi
echo "$awkv1"
您可以通过以下方式调用此脚本:cat list.txt | getlist f
答案 1 :(得分:1)
为什么不做以下事情:
档案:获取列表
#!/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
这样,您可以列出标记为f
或v
的字段:
$ ./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
$
答案 2 :(得分:1)
在字符串变量中存储部分命令行更容易使用bash数组。
您可以像这样调整脚本:
#!/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