我想把HDFS的目录名和awk结合起来。这可行吗?目录名,而不是文件名。下面是我的awk在本地的工作情况:
awk 'NR <= 1000 && FNR == 1{print FILENAME}' ./*
然后我想把它和hadoop fs -ls结合起来,就像这样:
hadoop fs -ls xxx/* | xargs awk 'NR <= 1000 && FNR == 1{print FILENAME}'
但请告诉我:awk:命令行:2:致命错误:无法打开文件'-rwxrwxrwx'进行阅读(没有这样的文件或目录)
我也试过像:
awk 'NR <= 1000 && FNR == 1{print FILENAME}' < hadoop fs -ls xxx/*
awk 'NR <= 1000 && FNR == 1{print FILENAME}' < $(hadoop fs -ls xxx/*)
awk 'NR <= 1000 && FNR == 1{print FILENAME}' $(hadoop fs -ls xxx/*)
这些都失败了,我认为awk执行文件目录需要读取每个文件,而不是像文件的内容那样可以将其作为流传递给awk。我说的对吗?谁能给予我一个可行的解决方案来做到这一点?谢谢,前进。
1条答案
按热度按时间wfypjpf41#
在我看来,您似乎想要访问hadoop文件系统上的文件。这是一个虚拟文件系统,您只能访问文件的元数据。如果您想对文件进行操作,那么首先在本地复制文件也很重要。这可以使用
hadoop fs -get
来完成。创建本地副本后,您可以开始对文件进行操作。但是,还有一种使用hadoop fs -cat
的替代方法。通常我会说Never parse the output of
ls
,但在Hadoop中,您没有选择。hadoop fs -ls
的输出与Unix/Linux命令ls
的标准输出不同。它与ls -l
密切相关,并返回以下输出:使用这个函数并将其传输到
awk
,我们得到了一个有用的文件列表。因此,我们现在可以设置一个while循环:**注意:**您的初始错误是由于
hadoop fs -ls
的输出不像Unix。程序awk
收到的文件名-rwxrwxrwx
实际上是文件本身的权限。