我收到以下几行作为某些 bash 管道的输出
output
20200604_tsv
20200605_tsv
20200606_tsv
20200706_tsv
我的变量中有一个 YYYYMMDD 格式的日期变量
filter_date="20200605"
我想在输出行上应用日期操作,即仅选择行的第一部分(“_”之前)小于等于filter_date的行。
即预期输出
20200604_tsv
20200605_tsv
如何在 bash 管道中实现这种过滤?
我尝试过以下操作(按字典顺序匹配字符串),但无法过滤并获取原始名称。
BASH_CMD_THAT_OUTPUT_LINES | sort | awk '{name = ($1); print name <= "20200605*"}'
## Answer
1
0
0
0
最佳答案
Awk 能够通过去除多余的内容来非常轻松地将字符串转换为数字。例如。如果向字符串 123_foo 添加 0,则该字符串将转换为 123。因此以下操作将执行您的请求:
command | awk '($0+0 < 20200605)'
如果您有像 YYYYMMDD 这样的可排序日期格式,则此方法非常有效。如果您有不同的格式,例如 YYYYDDMM,则必须首先转换格式来使用不同的技术。例如。
command | awk '{d=substr($0,1,4)substr($0,7,2)substr($0,5,2)}(d+0 < 20200605)'
请注意,在最后一个解决方案中,您必须反转最后一个数字中的月份和日期:即 20200605 是 YYYYMMDD 而不是 YYYYDDMM
关于bash - 如何根据行开头的日期过滤 bash 命令的输出行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62755484/