0

ファイルがCSVあり、異なる値が 5 つ未満の列を削除したいと考えています。例えば

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

a次に、 2 つの異なる値 (1,2) しかないため、列を削除します。これを行う方法?

4

2 に答える 2

1

この問題を解決するには、このファイルを読み取ってデータ(数値)を取得し(配列に入れることができます)、削除する列を検索し、最後にこの結果をファイルに書き戻すことができると思います。

于 2013-07-11T16:40:14.127 に答える
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;
于 2013-07-11T18:03:46.660 に答える