bash - 计算多个子目录中每个文件中的行

标签 bash hadoop hdfs

我需要遍历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/

相关文章:

hadoop - Spark - 如何在 HDFS 中重组目录

hadoop - Hive将文件存放在HDFS的什么地方?

linux - 使用 Batch 解决 Linux 通配符问题

linux - 在 bash 脚本中发出回显变量

Hadoop/Yarn (v0.23.3) 伪分布式模式设置::无作业节点

hadoop - 无法从 Presto 使用 Cassandra

Hadoop conf确定num map任务

bash - 处理 find 返回的文件路径中的单引号

bash - 从文件中读取关联数组

hadoop - 如何在 Mac 上完全卸载 Hadoop