【发布时间】:2021-01-01 04:06:10
【问题描述】:
我一直在与 awk 进行斗争以完成这项工作,但我一直无法做到。我有两行如下:
= filename: /path/to/file
years="1990,2001"
我需要根据给定值检查引号之间的每一年,然后打印前一行,如果它匹配并得到文件名作为结果(它只需要匹配找到的第一个)。值和运算符,即 <,>,=,<=,=>,~ 将通过变量传递给 awk,例如:
value="2000"
string"=\$2 < $value" # just an example
awk ... '"$string"' ...
有条件语句可以根据收到的输入生成此字符串。
我尝试使用空格、引号和逗号作为分隔符来分隔每个字段:
awk -F'[," ]' '{i=(1+(i%N));if(buf[i]&& $2<2000) print buf[i]; buf[i]=$0;}'
这可行,但我需要遍历所有列 += $2。我试图做这样的事情:
awk -F'[," ]' '{for(f=2;f<=NF;f++);i=(1+(i%N));if(buf[i]&& $f>1950) print buf[i]; buf[i]=$0;}'
但这不起作用(我可能只是做错了)。
我还考虑过去掉if(buf[i]&& $2>1950) print buf[i]; buf[i]=$0;,只是加入两行并分隔字段,检查 += $5 上的循环,然后只打印“$3”,因为它始终是文件名,但我不能不知道如何将两条线合并为一条。
示例:
年份
输入文字:
= filename: /mnt/project1/record1.txt
years="2005,2019,2011,2012,2013"
= filename: /mnt/project1/record2.txt
years="1996,2000"
= filename: /mnt/project1/record3.txt
years="2005,2001,2012"
= filename: /mnt/project1/record4.txt
years="2010,2009,1997,2000"
输出(匹配):
/mnt/project1/record2.txt
/mnt/project1/record4.txt
【问题讨论】:
-
请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
-
您的示例显示
year < 2000;您会一直寻找小于 (<) 所需目标日期(例如,在您的示例中为2000)的日期吗?您是否还需要查看其他比较...>、<=、>=、date1 <= year <= date2等? -
不,它需要是任何运算符或 ~ (如果需要,用于字符串)。 '$2 [operator] [value]' 将作为字符串传递给 AWK:即 "var="\$2
-
@bcHelix 这与您的问题中当前显示的要求非常不同(您可以从到目前为止收到的答案中看到)。请edit您的问题提供更清晰的需求陈述和更真实的示例。
-
您的示例代码显示了一年的测试
>1950,但示例输入/输出基于一年的测试< 2000;可能应该着眼于更新问题,以更简洁/清晰地解释您在做什么;提供几个不同的输入/输出示例(例如,>1950、<2000和任何演示~ (for strings if need be))也不会造成什么影响
标签: awk