Tengo un archivo .CSV con el siguiente formato:
"column 1","column 2","column 3","column 4","column 5","column 6","column 7","column 8","column 9","column 10
"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23455","12312255564","string, with, multiple, commas","string with or, without commas","string 2","USD","433","70%","07/15/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""
"46476","15467534544","lengthy string, with commas, multiple: colans","string with or, without commas","string 2","CAND","388","70%","09/21/2013",""
La quinta columna del archivo tiene diferentes cadenas. Necesito filtrar el archivo según el valor de la quinta columna. Digamos que necesito un nuevo archivo del archivo actual que tiene registros solo con el valor "cadena 1" en su quinto campo.
Para esto probé el siguiente comando,
awk -F"," ' { if toupper($5) == "STRING 1") PRINT }' file1.csv > file2.csv
pero me estaba arrojando un error de la siguiente manera:
awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error
awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error
Luego usé lo siguiente que me da una salida extraña.
awk -F"," '$5="string 1" {print}' file1.csv > file2.csv
Salida:
"column 1" "column 2" "column 3" "column 4" string 1 "column 6" "column 7" "column 8" "column 9" "column 10
"12310" "42324564756" "a simple string with a comma" string 1 without commas" "string 1" "USD" "12" "70%" "08/01/2013" ""
"23455" "12312255564" "string with string 1 commas" "string with or without commas" "string 2" "USD" "433" "70%" "07/15/2013" ""
"23525" "74535243123" "string with commas string 1 "string with or without commas" "string 1" "CAND" "744" "70%" "05/06/2013" ""
"46476" "15467534544" "lengthy string with commas string 1 "string with or without commas" "string 2" "CAND" "388" "70%" "09/21/2013" ""
PD: Utilicé el comando toupper para estar en el lado seguro, ya que no estoy seguro de si la cadena estará en mayúsculas o minúsculas. Necesito saber qué está mal con mi código y si el espacio en la cadena importa mientras busco un patrón usando AWK.
'","'
delimitador, de lo contrario habría resuelto mi problema ... gran solución ...'","'
el delimitador es lo que la mayoría de las respuestas a su pregunta anterior sugirió :).else{if(toupper($5)=="HYPERION"){print}}
. No en mi computadora en este momento, por lo que podría tener la sintaxis incorrecta, pero no puede dar una condición a una instrucción else.awk -F '","' 'BEGIN {OFS=","} { if (NR==1) {print} else{if (toupper($5) == "STRING 1") print} }' file1
El problema con CSV es que no hay un estándar. Si necesita lidiar con datos con formato CSV con frecuencia, es posible que desee buscar un método más robusto en lugar de simplemente usarlo
","
como su separador de campo. En este caso, losText::CSV
módulos CPAN de Perl son excepcionalmente adecuados para el trabajo:fuente
fuente
'","'
lo hará ... gracias ... :)awk 'BEGIN {FS = "," }' '{print $0}'
, verá que no produce ningún resultado. En el futuro, pruebe sus respuestas para ver si realmente funcionan antes de publicarlas.