2013-07-11 10 views
0

我有一個CSV文件,我想刪除具有少於5個不同值的列。 e.g計數模式數

a b c; 
1 1 1; 
1 2 2; 
1 3 4; 
2 4 5; 
1 6 7; 

然後我想除去柱a,因爲它僅具有兩個不同的值(1,2)。這個怎麼做?

+0

聲音很像一些家庭作業......你嘗試過這麼遠嗎? – Lochemage

回答

1

利用溶液陣列:

infile="infile.txt" 

different=5 
rows=0 

while read -a line ; do 
    data+=(${line[@]/;/})      # remove all semicolons 
    ((rows++)) 
done < "$infile" 

cols=$((${#data[@]}/rows))      # calculate number of rows 

result=() 
for ((CNTR1=0; CNTR1<cols; CNTR1+=1)); do 
    cnt=() 
    save=(${data[CNTR1]})      # add column header 
    for ((CNTR2=cols; CNTR2<${#data[@]}; CNTR2+=cols)); do 
    cnt[${data[CNTR1+CNTR2]}]=1 
    save+=(${data[CNTR1+CNTR2]})    # add column data 
    done 
    if [ ${#cnt[@]} -eq $different ] ; then  # choose column? 
    result+=(${save[@]})      # add column to the result 
    fi 
done 

cols=$((${#result[@]}/rows))      # recalculate number of columns 

for ((CNTR1=0; CNTR1<rows; CNTR1+=1)); do 
    for ((CNTR2=0; CNTR2<${#result[@]}; CNTR2+=rows)); do 
    printf " %s" "${result[CNTR1+CNTR2]}" 
    done 
    printf ";\n" 
done 

輸出:

b c; 
1 1; 
2 2; 
3 4; 
4 5; 
6 7; 
1

我認爲要解決這個問題,你可以讀取這個文件來獲取數據(數字)(可以放入數組),然後搜索你想刪除的列,並最終將這個結果寫回文件。