Bash 脚本查找文件任意单行中特定字符(“.”)的最大数量

Bash 脚本查找文件任意单行中特定字符(“.”)的最大数量

有一个行数未知的文件。文件中的每一行包含未知的多个句点 ( .)。

如何找到最大周期数?我是不是有兴趣找到包含最多句号的行。

例如:在 bash 中处理下面的文件内容应该给出答案“4”。

one.one
two.two.two
three.three.three.three
four..four.
five..five..
six...six

答案1

你可以这样做awk

awk '{gsub(/[^.]/,""); len=length(); if (len>max) {max=len}} END{printf("Largest count of \".\": %d\n",max)}' file.txt

这将为每一行替换所有字符不是 .,“无”(即删除所有不是 的内容.)。然后,它将计算剩余字符串的长度,并将找到的最大值存储在 中max。在文件末尾,它将打印结果。

答案2

或者,您可以计算特定字符的数量,并保持文本不变以进行进一步处理,例如打印行本身或计算另一个字符。 gsub 返回替换数。

awk '{ nDot = gsub ("[.]", "."); etc .. }'

答案3

无 awk 的答案:

sed 's/[^.]//g' test.dat | wc -L

换句话说,仅保留点,并使用 -L 选项wc-L, --max-line-length: print the maximum display width

答案4

一种方法awk可能如下。我们需要认识到以下等式成立:

  • number of fields = number of delimiters + 1

请注意,在算术比较中向操作数添加 a 0,尽管并不总是必要,但却是一个值得灌输的好习惯。至少它帮助我少思考一件事,因为它变成了一种自动反射编码动作。由于Awk不提供用于算术和字符串比较的单独运算符,因此需要强制来帮助消除字符串与数学操作数或更确切地说上下文的歧义。

$ awk -F '[.]' '
    NF>m+0 {m=NF}
    END {print --m}
' file
4
$ awk '
    gsub(/[^.]+/, "") &&
    ! index(t, $0) { t = $0 }
    END { print length(t) }
' file
$ perl -lne '
    my $k = tr/.//;
    $k > $m and $m = $k;
    }{ print $m+0;
' file

GNU sed编辑器还可以与二进制计算器实用程序结合使用bc。我们的想法是,我们将线条从所有非点上剥离下来,并保留当前最长的纯点串。在 处eof,我们将这些点转换为可操作的bc代码以生成这些点的数量。

$ sed -Ee '
    s/[^.]+//g;G
    /^(.*)..*\n\1$/!ba
    s/\n.*//;h;:a
    $!d;g;s/./1+/g;s/$/0/
'  file | bc -l

相关内容