【问题标题】:grep command to find out how many times any character is followed by '.'grep 命令找出任何字符后跟 '.' 的次数
【发布时间】:2018-04-03 06:09:37
【问题描述】:

我必须在 grep 的帮助下找出任何字符后跟句点 (.) 的频率。在找到字符后跟句号的次数之后,我必须按升序对结果进行排序。

例如在这个字符串中:“找到我的输入。应该得到输出。你需要找到输出。”

输出应该是这样的:

d 1 
t 2

到目前为止我做了什么:

cat filename | grep -o "*." | sort -u 

但它没有按预期工作。

任何想法如何解决这个问题?我必须对 .txt 文件中的庞大图书库执行此操作。

【问题讨论】:

  • 感谢您的建议,已修复。
  • @N3o:你想按个数还是按字符排序?
  • @batMan 我想按计数对其进行排序,赛勒斯解决方案似乎有效

标签: regex bash sorting unix grep


【解决方案1】:

这个也不错

echo "Find my input. Output should be obtained. You need to find output."| grep -o ".\." | sort | uniq -c | rev | tr -d .

【讨论】:

    【解决方案2】:

    使用单个 GNU awk 进程:

    awk -v FPAT='.[.]' 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_asc" }
           { for(i=1;i<=NF;i++) a[substr($i,1,1)]++ }
           END{ for(i in a) print i,a[i] }' filename
    

    输出:

    d 1
    t 2
    

    【讨论】:

    • 虽然它是一个单一的进程,但我想这会比 grep 解决方案慢,因为这将涉及更多的内部事务/函数调用。我可能错了,但找出哪个处理得更快会很有趣。 @N3o:您能告诉我们执行这两种解决方案哪个更快吗?
    【解决方案3】:

    使用 GNU grep 的迭代方法:

    grep -o '.\.' filename | sort | uniq -c
    

    输出:

    1天。 2吨。
    grep -Po '.(?=\.)' filename | sort | uniq -c
    

    输出:

    1天 2吨
    grep -Po '.(?=\.)' filename | sort | uniq -c | awk '{print $2,$1}'
    

    输出:

    d 1 t 2

    【讨论】:

    • 顺便说一句:可以将sort | uniq -c | awk '{print $2,$1}' 替换为awk '{a[$1]+=1} END{for(i in a) print i,a[i]}'
    • 这将需要另一个 sort -n 在最后,因为 op 希望对最终输出进行排序
    • @batMan:很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2020-12-16
    • 2017-10-18
    相关资源
    最近更新 更多