在我的脚本的每个输出之前打印一个语句

时间:2016-02-15 23:18:04

标签: bash unix grep

我有一个脚本,用于检查文件夹中的每个文件的单词"作者"然后打印出次数,每个文件一行,按从高到低的顺序排列。我总共有825个文件。输出的示例是

53
22
17

我想这样做,以便在每一行的每个数字之前打印出一些东西。这将是以下hotel_$i所以上面的例子现在是:

hotel_1 53
hotel_2 22
hotel_3 17

我尝试在shell脚本中使用for循环执行此操作:

for i in {1..825}
do
    echo "hotel_$i"
    find . -type f -exec bash -c 'grep -wo "Author" {} | wc -l' \; | sort -nr
done

但这基本上打印出hotel_1,然后对所有825个文件进行搜索和排序,然后hotel_2重复搜索和排序,依此类推。如何制作它以便在每次输出之前打印?

1 个答案:

答案 0 :(得分:2)

您可以使用paste命令,该命令组合来自不同文件的行:

paste <(printf 'hotel_%d\n' {1..825}) \
<(find . -type f -exec bash -c 'grep -wo "Author" {} | wc -l' \; | sort -nr)

(为了便于阅读,只需将其放在两行上,可以是没有\的单行。)

这将pasteprocess substitution结合在一起,使得命令的输出看起来像paste的文件(命名管道)。

第一个命令在每个单独的行上打印hotel_1hotel_2等,第二个命令是find命令。

对于短输入文件,输出如下所示:

hotel_1 7
hotel_2 6
hotel_3 4
hotel_4 3
hotel_5 3
hotel_6 2
hotel_7 1
hotel_8 0
hotel_9 0