在多个子目录中计算每个文件中的行数

carvr3hs  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(308)

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

... 我如何防止它在文件名后破裂?

wvmv3b1j

wvmv3b1j1#

如果我们分解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

使用上述方法,您将获得filename和count,中间没有任何空格或分隔符。可以在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

相关问题