如何通过变量bash过滤行

时间:2019-11-26 14:33:36

标签: bash awk

我需要按bash变量过滤行。

var=$(cat $1 | awk -F"\t" ' $1 == "foo1" { print $0 }')
echo $var

我正在尝试将字符串“ foo1”替换为变量

column2=$(echo "foo1")
echo $column2
var=$(cat $1 | awk -v pres=$column2 -F"\t" ' $1 == $pres { print $0 }')
echo $var

在参数$ 1中,我传递了具有下一个文本的file.txt

foo2    AAAA    561214
foo3    AAAA    3
foo4    AAAA    10470670
foo5    AAAA    443507
foo1    AAAA    12473709
foo6    AAAA    1599707
foo8    AAAA    382820
foo7    BBBB    100000000000000
foo1    AAAA    12473709
foo1    AAAA    12473709
foo1    AAAA    12473709
foo1    AAAA    12473709
foo1    AAAA    12473709
foo1    AAAA    12473709
foo1    AAAA    12473709

我需要使用变量来执行此操作,因为我需要为第一列的每个不同值进行循环。

编辑

我的问题与bash-How do i use shell variable in a awk script不同,因为我需要做一个条件来过滤文件中表的行。我可以做到这一点,但我不知道该如何结合做

var=$(cat $1 | awk -F"\t" ' $1 == "foo1" { print $0 }')

正在工作,但是当我尝试插入变量时停止工作。

2 个答案:

答案 0 :(得分:2)

您应使用以下结构:

column2="foo1"
var=$(cat $1 | awk -v pres=$column2 -F"\t" ' $1 == pres { print $0 }')

awk中的变量不需要$符号

答案 1 :(得分:2)

请您尝试以下。

column2="foo1"
var=$(awk -v pres="$column2" -F"\t" '$1==pres' "$1")

我们不需要在这里使用cat,因为awk可以读取Input_file本身。

第二件事,当默认情况下代码中的条件为TRUE时,我们无需使用print,它将打印该行(如果没有为该条件给出任何操作),因此我从上面的代码中将其删除。