【问题标题】:Finding the Number of strings in a File查找文件中的字符串数
【发布时间】:2016-04-19 18:52:55
【问题描述】:

我正在尝试编写一个非常小的程序来检查大型文本文件中子字符串的数量。它所要做的就是计算文本文件的前 2000 行,找到任何“TTT”子字符串,计算它们,并将变量设置为该总数。我对 shell 有点陌生,所以任何帮助都将不胜感激!

#!/bin/bash

$counter=(head -2000 [file name] | grep TTT | grep -o TTT | wc -l)
echo $counter

【问题讨论】:

  • 不行吗?你实际上并没有问任何问题。
  • 它给出了一个语法错误,如果不清楚,对不起
  • 您必须使用counter= 而不是$counter=。顺便说一句,第一个grep TTT 可以跳过。
  • 可能你的意思是counter=$(<pipe command>)
  • 您的输入文件是什么样的?一行中有多次“TTT”吗?

标签: linux bash shell command-line


【解决方案1】:

对于它的价值,你可能会awk 更适合这项任务:

awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename

这将通过分隔符“ttt”分割文件中的每条记录。然后它计算字段数,减一,然后将其添加到总数中。

像这样的文件:

ttt tttttt something
1 5 ttt
tt
one more ttt record

将被拆分(用管道分隔符可视化),如:

| || something
1 5 |
tt
one more | record

计算每条记录的字段数:

4
2
1
2

从中减去一个:

3 
1
0
1

总计为 5,即存在多少个“ttt”子字符串。

要将其合并到您的脚本中(并修复您的其他问题):

#!/bin/bash

counter=$(awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename)
echo $counter

这里的变化是,当我们在 Bash 中设置变量时,我们不包括前面的 $ 符号。只有在引用变量时,我们才包含$

【讨论】:

  • 要不要更进一步? awk -v RS="ttt" 'END{print NR-1}' file
【解决方案2】:

你有一些小的语法错误,可能你的意思是这样的:

counter=$(head -2000 [file name] | grep TTT | grep -o TTT | wc -l)
echo $counter

请注意我为使其正常工作所做的微小更改。

顺便说一下,中间的grep TTT是多余的,你可以直接去掉,即:

counter=$(head -2000 [file name] | grep -o TTT | wc -l)

【讨论】:

    【解决方案3】:

    grep 已经可以做你想做的事了:counter=$(grep -c TTT $infile)。您可以使用 -m NUM, --max-count=NUM 限制命中数(不是行数),这会使 grep 在文件末尾或找到 NUM 出现时停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多