使用awk函数从HDFS目录中提取特定部分



我正在尝试从目录中提取特定部分/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-22175520220103-23175420220111-15214520220112-155012然后按日期 =>20220110的那些过滤,因此,最终结果应该是:20220111-15214520220112-155012,因为2022011120220112=>到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.deflate00002.deflate,而不是20220111-15214520220112-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

不好,因为2020091620200916...不是 =>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}'

最新更新