ファイルがCSV
あり、異なる値が 5 つ未満の列を削除したいと考えています。例えば
a b c;
1 1 1;
1 2 2;
1 3 4;
2 4 5;
1 6 7;
a
次に、 2 つの異なる値 (1,2) しかないため、列を削除します。これを行う方法?
ファイルがCSV
あり、異なる値が 5 つ未満の列を削除したいと考えています。例えば
a b c;
1 1 1;
1 2 2;
1 3 4;
2 4 5;
1 6 7;
a
次に、 2 つの異なる値 (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;