我有一个CSV
文件,我想删除少于 5 个不同值的列。例如
a b c;
1 1 1;
1 2 2;
1 3 4;
2 4 5;
1 6 7;
然后我想删除列a
,因为它只有两个不同的值(1,2)。这个怎么做?
我有一个CSV
文件,我想删除少于 5 个不同值的列。例如
a b c;
1 1 1;
1 2 2;
1 3 4;
2 4 5;
1 6 7;
然后我想删除列a
,因为它只有两个不同的值(1,2)。这个怎么做?
我认为要解决此问题,您可以读取此文件以获取数据(数字)(可以放入数组中),然后搜索要删除的列,最后将此结果写回文件。
使用数组的解决方案:
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;