在 AWK 中将变量插入字符串

在 AWK 中将变量插入字符串

我正在尝试使用循环和 awk 命令将变量传递给简单的 bash 脚本。

#!/bin/bash
#! script to filter data to respective directories.

for i in {1..9};
do
        awk  -F "\t" -v num="$i" '$3 ~ /^ *2017-0$num/ {print}' source1.txt source2.txt  > energydata/2017/$i/results.txt
done;

我能够成功运行 awk 命令,如下所示:

        awk  -F "\t" '$3 ~ /^ *2017-01/ {print}' source1.txt source2.txt  > energydata/2017/1/results.txt

我只是希望能够循环遍历日期中的月份列并帮助自动化此过程。我认为我错误地使用了 -v 变量传递,但似乎无法弄清楚如何将变量附加到这样的日期上。我知道如果我在设定的日期内联运行 awk 语句,它就会起作用,它只是试图插入让我陷入困境的变量。

任何提示或建议都有帮助

输入和输出示例:

来源1.txt:

1   dog   2020-02-03 
2   cat   2017-01-12

来源2.txt:

5   Frog  2022-02-05 
7   Mouse   2017-01-11

输出:energydata/2017/01/results.txt

2   cat   2017-01-12
7   Mouse   2017-01-11

答案1

如果我没记错的话,该/.../ 语法仅适用于 AWK 中的常量正则表达式。如果您想匹配不同的正则表达式,则必须将其作为字符串传递。另外,$只是一个选择编号字段的运算符,它不会扩展变量。相反,您只需连续编写字符串和/或变量即可将它们连接起来。

所以,例如,这有效

% echo 2017-01 | awk -v m=1 '$1 ~ "2017-0" m { print "match" }'
match

或者,你可以这样做{ pattern = "2017-0" m; if ($1 ~ pattern) ... },但不会那么简洁。


无论如何,如果您想根据输入行的内容将其拆分为文件,您也可以让 AWK 构建文件名并打开输出文件本身。

例如,这将构建类似 、 和 的文件名,其中和是从该行的第三个字段中选取的。不过,您必须事先创建目录。energydata/yyyy/mm/results.txtyyyymm

awk -F "\t" '{ split($3, date, "-");
               filename = "energydata/" date[1] "/" date[2] "/results.txt";
               print > filename }' source.txt

相关内容