我必須使用 bash 來遍歷 CSV 檔案并替換滿足條件的列的值。最后,結果必須存盤在輸出檔案中。
我已經撰寫了這段代碼,它讀取檔案并將內容存盤在一個陣列中。在遍歷檔案時,如果第 13 列的值等于“NULL”,則該記錄的值必須替換為“0”。檢查檔案后,帶有替換值的輸出將存盤在 file_b 中。
#!/bin/bash
file="./2022_Accidentalidad.csv"
while IFS=; read -ra array
do
if [[ ${array[13]} == "NULL" ]]; then
echo "${array[13]}" | sed -n 's/NULL/0/g'
fi
done < $file > file_b.csv
問題是 file_b 是空的。那里什么也沒寫。我怎么能這樣做?
我不能使用 AWK,必須使用 FOR 或 WHILE 命令來遍歷檔案。
樣本輸入:
num_expediente;fecha;hora;localizacion;numero;cod_distrito;distrito;tipo_accidente;estado_meteorológico;tipo_vehiculo;tipo_persona;rango_edad;sexo;cod_lesividad;lesividad;coordenada_x_utm;coordenada_y_utm;positiva_alcohol;positiva_droga
2022S000001;01/01/2022;1:30:00;AVDA. ALBUFERA, 19;19;13;PUENTE DE VALLECAS;Alcance;Despejado;Turismo;Conductor;De 18 a 30 a?os;Mujer;NULL;NULL;443359,226;4472082,272;N;NULL
預期產出
num_expediente;fecha;hora;localizacion;numero;cod_distrito;distrito;tipo_accidente;estado_meteorológico;tipo_vehiculo;tipo_persona;rango_edad;sexo;cod_lesividad;lesividad;coordenada_x_utm;coordenada_y_utm;positiva_alcohol;positiva_droga
2022S000001;01/01/2022;1:30:00;AVDA. ALBUFERA, 19;19;13;PUENTE DE VALLECAS;Alcance;Despejado;Turismo;Conductor;De 18 a 30 a?os;Mujer;0;NULL;443359,226;4472082,272;N;NULL
提前非常感謝。
uj5u.com熱心網友回復:
你不需要sed。只需替換$array[13]為0. ;然后在欄位之間使用分隔符列印整個陣列。
( # in a subshell
IFS=';' # set IFS, that affects `read` and `"${array[*]}"`
while read -ra array
do
if [[ ${array[13]} == "NULL" ]]; then
array[13]=0
fi
echo "${array[*]}"
done
) < $file > file_b.csv
echo使用第一個字符$IFS作為輸出欄位分隔符。
uj5u.com熱心網友回復:
什么時候awk也可以:
awk 'BEGIN{FS=OFS=";"} NR==2 && $14=="NULL"{$14=0} {print}' "$file" > file_b.csv
請參閱:8 個強大的 Awk 內置變數——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
uj5u.com熱心網友回復:
BASH_REMATCH使用正則運算式和陣列的一個想法:
regex='(([^;]*;){13})(NULL)(;.*)'
while read -r line
do
[[ "${line}" =~ $regex ]] &&
line="${BASH_REMATCH[1]}0${BASH_REMATCH[4]}"
# uncomment following line to display contents of BASH_REMATCH[] array
# declare -p BASH_REMATCH
echo "${line}"
done < file.csv > file_b.csv
這會產生:
$ cat file_b.csv
num_expediente;fecha;hora;localizacion;numero;cod_distrito;distrito;tipo_accidente;estado_meteorológico;tipo_vehiculo;tipo_persona;rango_edad;sexo;cod_lesividad;lesividad;coordenada_x_utm;coordenada_y_utm;positiva_alcohol;positiva_droga
2022S000001;01/01/2022;1:30:00;AVDA. ALBUFERA, 19;19;13;PUENTE DE VALLECAS;Alcance;Despejado;Turismo;Conductor;De 18 a 30 a?os;Mujer;0;NULL;443359,226;4472082,272;N;NULL
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474234.html
下一篇:bash中多個檔案的標準偏差
