0

我有一个CSV文件,我想删除少于 5 个不同值的列。例如

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

然后我想删除列a,因为它只有两个不同的值(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 回答