计算每行出现的字符数

Counting number of character occurrences per line

我有一个如下所示的文件:(注意:A*、B*、C* 是占位符)。文件由 ;

分隔
AAAA;BBBB;CCCCCCCC;DD;EEEEEEEE;FF;
AAA1;BBBBB;CCCC;DD;EEEEEEEE;FFFFF;
AAA3;BB;CCCC;DDDDDDDDD;EEEEEEE;FF;

我正在尝试编写一个小脚本来计算分隔符 ; 的出现次数,如果它小于或大于 5,则将所述行输出到文本文件。

delim=";"

while read line
do  
    n_of_occ=$(grep -o "$delim" <<< "$line" | wc -l)

    if [[ $n_of_occ < 5 ]] || [[ $n_of_occ > 5 ]]
    then
        echo $line >> outfile
    fi
done

出于某种原因,这似乎不起作用,而且我的输出是乱码。有人可以协助或提供不同的方法来解决这个问题吗?也许用 Perl 而不是 bash?

awk 这太简单了:

awk -F\; 'NF!=6' file > outfile

我会选择这条线:

awk '{x=[=10=]}gsub(";","",x)!=5' file

在 Perl 中很简单:

perl -ne 'print if tr/;// != 5' input_file > output_file
  • -n逐行读取输入
  • tr运算符returns匹配数

使用 sed 你可以这样做:

sed '/^\([^;]*;\)\{5\}$/d' file > outfile

它删除正好有 5 个逗号 (;) 的行,并将输出发送到 outfile


或者,如果您希望自己的代码能够正常工作,请进行以下更改:

  1. done替换为done <file
  2. [[ 替换为 ((,将 ]] 替换为 )),即使用 ((...)) 而不是 [[...]]

不幸的是,示例数据中的每一行都有六个分号,这意味着它们都应该被打印出来。但是,这是一个单行的 Perl 解决方案

$ perl -ne'print if tr/;// != 5' aaa.csv
AAAA;BBBB;CCCCCCCC;DD;EEEEEEEE;FF;
AAA1;BBBBB;CCCC;DD;EEEEEEEE;FFFFF;
AAA3;BB;CCCC;DDDDDDDDD;EEEEEEE;FF;