我尝试在HDFS中搜索parquet文件并列出它们。我正在使用这个,它工作得很好。它搜索/sources.works_dbo
中的所有子目录,并给我所有的parquet文件:
hdfs dfs -ls -R /sources/works_dbo | grep ".*\.parquet$"
然而,我只想返回每个子目录遇到的第一个文件,这样每个子目录在输出中只出现在一行中。假设我有这样的文件:
sources/works_dbo/test1/file1.parquet
sources/works_dbo/test1/file2.parquet
sources/works_dbo/test2/file3.parquet
当我运行命令时,我希望输出如下所示:
sources/works_dbo/test1/file1.parquet
sources/works_dbo/test2/file3.parquet
4条答案
按热度按时间w41d8nur1#
上面的例子使用了GNU awk的gensub(),而其他awk则使用了一个变量和sub():
它将适用于任何长度路径的任何混合。
f8rj6qna2#
您可以使用
sort -u
(unique),以/
作为分隔符,并使用前三个字段作为关键字。-s
选项(“stable”)确保保留的文件是每个子目录遇到的第一个文件。对于此输入
结果是
t98cgbkg3#
如果子目录的长度是可变的,那么
awk
解决方案可能会派上用场:epfja78i4#
使用Perl:
在上面的 perl 命令中:
-M
加载File::Basename
模块;-n
使Perl将通过-e
传递的表达式应用于每个输入行;-l
保留行终止符;$_
是保持当前读取行的默认变量;dirname($_)
返回由$_
指定的路径的目录部分;$h
是散列,其中键是目录名,值是整数0、1、2等;$h{ dirname($_) }
非零,否则该行被打印到标准输出。顺便说一下,您可以使用
find
命令,而不是通过grep
将hdfs dfs -ls -R
的结果传送到管道: