我正在尝试从目录中提取特定部分/rec/flux_entrant/archive/le501/tble91_formation_eligible/*
。此目录位于HDFS
中,以便我们可以使用以下命令公开其包含:hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/*
返回
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220104-221755/00000.deflate
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220103-231754/00001.deflate
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220111-152145/00002.deflate
/rec/flux_entrant/archive/le501/tble91_formation_eligible/20220112-155012/00003.deflate
我的对象是只提取这些路径的最后一部分(不是xxx.deflate文件):20220104-221755
、20220103-231754
、20220111-152145
和20220112-155012
然后按日期 =>20220110
的那些过滤,因此,最终结果应该是:20220111-152145
和20220112-155012
,因为20220111
和20220112
=>到20220110
我尝试使用以下命令使用awk
命令:
hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/* | awk -F'/' '{split($NF, a, "-"); if (a[1]>20220110) print $NF}'
但是这个回报:00003.deflate
和00002.deflate
,而不是20220111-152145
和20220112-155012
编辑
正如@Tom所建议的,我用print $(NF-1)
而不是$NF
,但过滤器不好。我还尝试在列表变量中获取结果:
OUTPUT=$(hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/* |
awk -F'/' '{split($NF, a, "-"); if (a[1]>=20220110) print $(NF-1)}')
echo ${OUTPUT}
给
Found 5 items 20200916-170926 20200916-170926 20200916-170926 20200916-170926 20200916-170926 Found 5 items 20200916-182251
不好,因为20200916
,20200916
...不是 =>20220110我还需要从最终结果中删除Found 5 items
请帮忙吗? 谢谢
试试这个,使用 AWK 的变量FPAT
:
hdfs dfs -ls /rec/flux_entrant/archive/le501/tble91_formation_eligible/* |
awk -v startdate="20220110" 'BEGIN{FPAT="[0-9]{8}-[0-9]{6}"}($1 >= startdate){print $1}'
我使用变量startdate
来避免将字符串20220110
硬编码到 AWK 代码中。
说明:FPAT
是一个正则表达式,描述了AWK必须考虑的字段:在我们的例子中,一个8位数字的序列,后跟一个连字符和6个数字。AWK用指令print $1
打印它在输入的每一行中找到的唯一序列,条件是($1 >= startdate)
。
据我了解,您实际上希望从以下开始:
$ hdfs dfs ls -d /path/to/dir/*/
这将选择/path/to/dir
下的所有子目录,并且由于标志-d
而不遍历它们(请参阅 hadoop文档。从那时起,选择目录就很简单了。该目录的形式为YYYYMMDD-hhmmss
,因此可按字典顺序排序。所以你可以做这样的事情:
$ hdfs dfs ls -d /path/to/dir/*/ | awk -F/ '($NF<"20220128"){print $NF}'
请注意,我们在$NF<"20220128"
中进行字符串比较而不是数字比较。由于 awk 的内部结构,您可以进行数字比较,awk 将在转换过程中去除字符串的所有非数字部分。所以你可以做:
$ hdfs dfs ls -d /path/to/dir/*/ | awk -F/ '($NF+0<20220128){print $NF}'