使用 awk if 根据第一列条件打印整行

使用 awk if 根据第一列条件打印整行

我有一个名为 test_data.txt 的文件,文件内内容如下:

20:20:20 test1
20:21:21 test2
20:21:49 test3
20:21:57 test4
20:21:57 test5
20:21:57 test6
20:22:57 test7
20:25:59 test8
20:25:59 test9
20:25:59 test10
20:25:59 test11
20:29:03 test12
20:29:04 test13
20:29:31 test14

例如,第一列是我想要搜索的内容。第一列显示小时:分钟:秒 (HH:MM:SS)。如果满足小时和分钟,我想使用变量来提取整条线的数据:

var1=20:20
var2=20:22
cat test_data.txt | awk '{if ($1 == "'"$var1"'" || $1 == "'"$var2"'") print $0;}'

预期输出:

20:20:20 test1
20:22:57 test7

我正在使用的 awk 显然不起作用,因为我不想在几秒钟内进行搜索。下面的方法确实有效,但是如何在示例中使用多个变量:

var1=20:20
var2=20:22
ERE='^'$var1':[[:digit:]]+$' <test_data.txt awk '$1 ~ ENVIRON["ERE"]'

我不确定上面是否可以在同一个命令中处理多个变量

上述命令的输出:

20:20:20 test1

答案1

您可以将多个 HH:MM 值作为空格分隔的字符串传递到 awk 中,然后将其分解为 awk BEGIN 块中的数组。然后,对于数据文件的每条记录,测试 $1 是否以 HH:MM 字符串之一开头。

awk -v times="20:20 20:22" '
  BEGIN {n = split(times, t)}
  {for (i=1; i<=n; i++) if (index($1, t[i]) == 1) {print; break}}
' test_data.txt

答案2

建立在一些@glennjacman 的代码- 您可以根据目标时间创建一个哈希表,并对输入值使用哈希查找以提高效率:

awk -v times="20:20 20:22" '
    BEGIN {
        split(times, tmp)
        for ( i in tmp ) {
            t[tmp[i]]
        }
        FS = ":"
    }
    ($1 FS $2) in t
' test_data.txt
20:20:20 test1
20:22:57 test7

相关内容