2016-05-17 176 views
2

我有一个如下所示的文件:(注意: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?

+0

您应该尝试提供一组正确代表性的数据。你样本的每一行都有六个分号';',根据你的规则,这意味着它们都应该被打印出来。一旦你说*“文件是用';'”来分隔的*除非它测试标准并附带相应的所需输出 – Borodin

回答

1

不幸的是,您样本数据中的每一行都有六个分号,这意味着它们都应该打印d。但是,这里是一行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; 
3

这是可笑容易awk

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

1

我想借此一行代码:

awk '{x=$0}gsub(";","",x)!=5' file 
1

容易在Perl:

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

使用sed可以做到这一点的数量:

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

它删除线,正好是5个逗号(;)和将输出发送到outfile


或者,如果你想自己的代码来工作,然后进行以下更改:

  1. done <file
  2. 取代done((]]))如更换[[使用((...))代替[[...]]
相关问题