Bash:如何计算文件中字符串出现的次数?

Car*_* Yi -1 string bash awk grep

我有一个看起来像这样的文件:

dog
cat
dog
dog
fish
cat
Run Code Online (Sandbox Code Playgroud)

我想在 Bash 中编写某种代码来使文件格式化为:

dog:1
cat:1
dog:2
dog:3
fish:1
cat:2
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何想法?该文件非常大(> 30K 行),所以代码应该有点快。

我在想某种循环......

像这样:

while read line; 
     echo "$line" >> temp.txt
     val=$(grep $line temp.txt)
     echo "$val" >> temp2.txt
done < file.txt 
Run Code Online (Sandbox Code Playgroud)

进而 paste -d ':' file1.txt temp2.txt

但是,我担心这会很慢,因为您要逐行进行。其他人怎么看?

anu*_*ava 5

您可以使用这个简单的awk方法为您完成这项工作:

awk '{print $0 ":" ++freq[$0]}' file
Run Code Online (Sandbox Code Playgroud)

dog:1
cat:1
dog:2
dog:3
fish:1
cat:2
Run Code Online (Sandbox Code Playgroud)