我需要遍历HDFS上的多个目录。我想打印出每个文件的名称以及该文件中的行数。除了文件名和计数之间的换行符之外,我几乎可以正常运行。这是我的代码:
for filename in `hdfs dfs -ls /path/to/main/directory/*/*part* | awk '{print $NF}' `; do echo $filename ; hdfs dfs -cat $filename | wc -l; done > foo.out
在输出中,我得到:
/path/to/file1
# of rows
/path/to/file2
# of rows
...
如何防止文件名后面出现中断?
最佳答案
如果我们分解for循环的代码,则会依次执行两个命令,首先执行echo命令,然后执行hdfs命令,这就是输出带有换行符的原因。有多种方法可以实现所需的输出,但以下是我的两分钱。
方法1:使用-n选项从echo中省略尾随换行符。
for filename in `hdfs dfs -ls /path/to/main/directory/*/*part* | awk '{print $NF}' `; do echo -n $filename; hdfs dfs -cat $filename |wc -l; done > foo.out
通过上述方法,您将获得文件名和计数,并且两者之间没有任何空格或定界符。您可以在echo语句本身中添加空格或任何定界字符。
echo -n "$filename : ";
方法2:通过使用backquote(acute)在echo语句中执行hdfs命令,将echo和hdfs命令合并到一行。
for filename in `hdfs dfs -ls /path/to/main/directory/*/*part* | awk '{print $NF}' `; do echo "$filename : `hdfs dfs -cat $filename |wc -l`"; done > foo.out
关于bash - 计算多个子目录中每个文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59271625/