Estoy tratando de mover la séptima columna de mi archivo csv al final usando
awk -F '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}',OFS= "$file"
donde $ file es un archivo .csv en un directorio. Sin embargo, la salida es
awk: ^ syntax error
¿Alguien sabe cómo solucionar este error?
text-processing
awk
rmb
fuente
fuente

^indica la parte específica de la orden en el que se encuentra el error.Respuestas:
La
-Fopción necesita un argumento:-F,por ejemplo.El final del
awkscript debe separarse con un(espacio de caracteres) con el resto de los parámetros.Si el separador de campo es
,y desea conservarlo, y si el número de columna es constante e inferior o igual a 11, intente esto:fuente
command file > newfile && mv newfile file. Dicho esto, nueva versión de GNUawkpara apoyar esto:gawk -i inplace '{blah blah}' file.mv newfile fileque pueda usarcat newfile > file ; rm -f newfile, esto preserva el inodo y los permisos defile.mktempnombres de archivos temporales en lugar de codificar en scripts. por ejemplotf=$(mktemp) ; command file > "$tf" ; cat "$tf" > file ; rm -f "$tf"La solución más corta sería
No estoy seguro de si
,+funcionará en todas lasawkversiones, pero funciona al menos en GNU awk, también con el-cmodo de compatibilidad.Explicación:
$(NF+1)=$7: primero agregamos el séptimo campo al final de la línea (podría ser$12=$7en este caso)$7="": en el siguiente paso se borra el séptimo campo (pero los delimitadores circundantes permanecen)$0=$0) tratando múltiples comas como separador de campo (esto se hace vía-F',+', aquí+significa una o más veces), y también reorganizar el registro actual$1=$1para forzar la reconstrucción de la línea usando el campo de salida previamente establecido separador (establecido por una opción-v OFS=,)1Entrada de ejemplo:
salida
fuente
,+debería funcionar.all,ball,call,,,fall→all,ball,call,fall). (2)$(NF+1)=$7es un enfoque inteligente. En mi humilde opinión,$0 = $0 OFS $7es un poco más claro, solo un par de caracteres más largos, y parece hacer lo mismo. ¿Puedes pensar en una situación en la que$0 = $0 OFS $7no haga lo mismo que tu código?$0=$0 OFS $7es probablemente idéntico a$(NF+1)=$7, pero solo con el resto del código sin cambios, no en general.Si está imprimiendo con
OFS=, sin un separador entre los campos, simplemente puede guardar el valor de$7en una variable, configurarlo$7para vaciarlo e imprimir la línea y la variable directamente. No necesita especificar todos los campos:fuente
Probablemente quieras decir:
fuente
awknunca ve las comillas simplesOFS='', ¿verdad? También puede simplemente escribirOFS=; Es exactamente lo mismo.Usted no ha dicho específicamente que quería utilizar awk, y qué decir que quería utilizar la edición in situ como el proporcionado por
sed -i, por lo que aquí es unased -ivariante. Porawklo general, es mejor trabajar con columnas, pero este es un caso en el que prefierosed, porque naturalmente maneja números arbitrarios de columnas.Explicación:
-rselecciona expresiones regulares extendidas para evitar muchas barras invertidasPor supuesto, esto no funcionará con archivos que ocultan comas entre comillas (o peor, escapen de ellas), pero awk tampoco lo manejará sin algunas acrobacias serias. Si tiene ese problema, sería mejor con el
perlmóduloText:CSVo elpythonmódulocsv.fuente
Un par de
awkvariantes (suponiendo que su archivo esté dentro de la variable$file)Aquí puede realizar un ciclo para todos los colores, imprimir con el separador de campo (OFS) e imprimir el terminador de registro (ORS) al final de la línea.
Aquí con el uso de una expresión regular y la
gensub()funciónmatando a la 7 ª campo y la impresión de que al final de la línea.
$0es todo el registro$nes el enésimo registroNFes el número de campos de la línea actualOFSel separador archivado de salidaORSel terminador de registro de salida1es el truco para decir a awktruee imprimir el valor predeterminado ($0).Actualización ...
Casi me olvido, es posible cambiar todas las columnas después de la 7ma .
fuente
OFS $7que sería más robusto que"," $7. (2) Creo que eso", " $7está mal, en la medida en que la pregunta indica que el OP no quiere espacios después de las comas. (Y, si los datos de entrada tenían espacios después de las comas, entonces$7sería ya comenzar con un espacio, y que estaría agregando un adicional.)OFS $7, no solo más robusto, sino aún más general ( "la prisa hace el desperdicio" )