2016-05-17 228 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((]]))如更換[[使用((...))代替[[...]]
相關問題