Bash 如何对字符串进行排序和计数

Bash 如何对字符串进行排序和计数,bash,awk,sed,grep,Bash,Awk,Sed,Grep,这是我的输入文件 yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA] yyyy-mm-dd hh:mm:ss string *5555555555 [AAAAA] yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA] yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA] yyyy-mm-dd hh:mm:ss string *2222222222 [AAAAA] yyyy-m

这是我的输入文件

yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *5555555555 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *3333333333 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [BBBBB]
yyyy-mm-dd hh:mm:ss string *6666666666 [AAAAA]

让我们把上面的输入看作是输入。Gz,如何用最后一列获得**的计数为[AAAAAA]

我需要一个使用SED、AWK或GREP的脚本

预期产出应为:

5  
如果上面的输入将最后一列扩展到新行怎么办?比如:

yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *5555555555 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA  
zzzzzzzzzzzz xxxxxxxx yy]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *2222222222 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *3333333333 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [AAAAA]
yyyy-mm-dd hh:mm:ss string *9999999999 [BBBBB]
yyyy-mm-dd hh:mm:ss string *6666666666 [AAAAA]    
在上述情况下,使用AWK不是很困难吗?如何使用SED克服这个问题

很抱歉再次编辑它。如果10位数字未知怎么办?就像*9999999999未知一样,我们能找出*nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

 awk '$NF ~ /\[A+\]/ && $(NF1)~/\*9+/' input | wc -l
为了简单起见,我使用
wc
-命令进行计数。当然,这也可以在awk中实现:

 awk '$NF ~ /\[A+\]/ && $(NF1)~/\*9+/{counter++}END{print counter}' input
更新:如何列出每个数字的出现次数

 awk '$NF ~ /\[A+\]/{ar[$(NF-1)]++}END{for(key in ar){print key,ar[key]}}' input
输出:

*2222222222 1
*6666666666 1
*5555555555 1
*3333333333 1
*9999999999 5
只需一个grep:

grep -c "\*9999999999.*\[AAAAA\]$" inputfile
当您将输入拆分为两行(有时)但仍在第一行时,您可以尝试

grep -c "\*9999999999.*\[AAAAA" inputfile

awk
救援

$ awk -v key='*9999999999' '$NF=="[AAAAA]" && $(NF-1)==key {c++} END{print c}' file
5

如果最后一个字段被分成两行,根据定义,它将不等于“[AAAAA]”

wrt
在上述情况下,使用AWK会不会很困难?如何使用SED克服这一问题?
您收到了错误的信息。AWK是专门设计用于多行记录的。毫不夸张地说,自20世纪70年代中期AWK发明以来,SED就不是用于多行文本的合适工具。请认真想想最重要的di您需要处理困难的输入案例,并且您的问题将显示这些案例以及给定该输入的预期输出,因为您提供的示例输入似乎没有反映您所描述的最坏情况。
$ awk -v key='*9999999999' '$NF=="[AAAAA]" && $(NF-1)==key {c++} END{print c}' file
5