我有一个脚本,用于检查文件夹中的每个文件的单词"作者"然后打印出次数,每个文件一行,按从高到低的顺序排列。我总共有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
重复搜索和排序,依此类推。如何制作它以便在每次输出之前打印?
答案 0 :(得分:2)
您可以使用paste
命令,该命令组合来自不同文件的行:
paste <(printf 'hotel_%d\n' {1..825}) \
<(find . -type f -exec bash -c 'grep -wo "Author" {} | wc -l' \; | sort -nr)
(为了便于阅读,只需将其放在两行上,可以是没有\
的单行。)
这将paste
与process substitution结合在一起,使得命令的输出看起来像paste
的文件(命名管道)。
第一个命令在每个单独的行上打印hotel_1
,hotel_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