计算跨多个文件的每个“版本”的总出现次数

时间:2019-08-07 09:17:34

标签: linux bash grep

Linux上的目录中有许多文件,每个文件都包含version行,格式为:#version x(其中x是版本号)。

我正试图找到一种方法来计算每个文件在所有文件中出现的不同版本的次数,并输出如下内容:

#version 1: 12
#version 2: 36
#version 3: 2

我不知道可能存在的所有潜在版本,所以我真的在尝试匹配包含#version的行。

我尝试使用grep -c之类的东西-但是,这仅给出了包含#version的所有行的总数-我找不到一种很好的方法来分割不同的版本号。

2 个答案:

答案 0 :(得分:1)

类似这样的方法可能会解决问题:

grep -h '#version' * | sort | uniq -c | awk '{print $2,$3": found "$1}'

示例文件:

filename:filecontent

file1:#version 1
file1.1:#version 1
file111:#version 1
file2:#version 2
file3:#version 3
file4:#version 4
file44:#version 4

输出:

#version 1: found 3
#version 2: found 1
#version 3: found 1
#version 4: found 2

grep version *获取所有带有版本的文件。sortuniq -c的结果进行排序,计算重复的次数,然后awk重新排列输出以进行所需的格式设置。

注意:grep的分隔符可能与操作系统上的:略有不同。

答案 1 :(得分:1)

可能传递多个命令:

strings * | grep '#version \w' | sort | uniq --count | awk '{printf("%s: %s\n", substr($0, index($0, $2)), $1)}''

操作明细:

  • strings *:从*提取当前目录中所有文件的文本字符串。
  • | grep '#version \w':将字符串传递到grep命令中,以查找所有出现的#version word
  • sort:将版本字符串传递到sort命令。
  • | uniq --count:将#version行的出现管道输送到uniq命令中,以输出每个#version...字符串的计数。
  • awk '{printf("%s: %s\n", substr($0, index($0, $2)), $1)}':将唯一计数发送到awk命令中,以将输出重新格式化为:#version ...: count

测试过程:

cd /tmp
mkdir testing 2>/dev/null || true
cd testing
# Create 10 testfile#.txt with random #version 1 to 4
for i in {1..10}; do
 echo "#version $(($RANDOM%4+1))" >"testfile${i}.txt"
done
# Now get the counts per version
strings * \
  | grep '#version \w' \
  | sort \
  | uniq --count \
  | awk '{printf("%s: %s\n", substr($0, index($0, $2)), $1)}'

测试输出示例:

#version 1: 4
#version 2: 2
#version 3: 1
#version 4: 3