我有一个名为 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