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

时间:2016-05-09 21:21:17

标签: 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-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]

让我们将上述输入视为 input.gz ,如何将最后一列的* 9999999999计数为[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未知,我们能否找出* NNNNNNNNNN最后一列发生的次数为[AAAAA]?

4 个答案:

答案 0 :(得分:2)

cat input_file | grep '[*]9999999999 \[AAAAA\]$' | wc -l

答案 1 :(得分:1)

试试这个:

 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

答案 2 :(得分:0)

只有一个grep:

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

如果输入分为2行(有时)但[AAAAA仍在第一行,则可以尝试

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

答案 3 :(得分:0)

awk救援!

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

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