我正在尝试使用循环和 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.txt
yyyy
mm
awk -F "\t" '{ split($3, date, "-");
filename = "energydata/" date[1] "/" date[2] "/results.txt";
print > filename }' source.txt