Esta línea funcionó hasta que tuve espacios en blanco en el segundo campo.
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
¿Hay alguna manera de que awk imprima todo en $ 2 o más? ($ 3, $ 4 ... hasta que no tengamos más columnas?)
Supongo que debería agregar que estoy haciendo esto en un entorno Windows con Cygwin.
grep | awk
es un antipatrón - quieresawk '/!/ { print $2 }'
svn status | grep '\!' | cut -d' ' -f2- > removedProjs
Respuestas:
imprimirá todo menos la primera columna:
imprimirá todas menos dos primeras columnas:
fuente
awk '{$1=""; print substr($0,2)}' input_filename > output_filename
awk -F, -vOFS=, '{$1=""; print $0}'
terminará con un delimitador inicial ($1
todavía se incluye, como una cadena vacía). Sinsed
embargo, puede quitar eso con :awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
Hay una pregunta duplicada con una respuesta más simple usando cut:
-d
especifica el delimitador (espacio) ,-f
especifica la lista de columnas (todas comenzando con la 2da)fuente
awk
versión, hay problemas de almacenamiento en línea concut
, queawk
no tiene: stackoverflow.com/questions/14360640/…awk
trata varios caracteres espaciales adyacentes. como un solo separador, mientrascut
que no; Además, aunque esto no es un problema en el caso en cuestión,cut
solo acepta un único carácter literal. como delimitador, mientras queawk
permite una expresión regular.Puede usar un bucle for para recorrer los campos de impresión de $ 2 a $ NF (variable incorporada que representa el número de campos en la línea).
Editar: Dado que "imprimir" agrega una nueva línea, querrás almacenar los resultados en el búfer:
Alternativamente, use printf:
fuente
'{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'
sin espacios iniciales o finales.Mi respuesta se basa en la de VeeArr , pero noté que comenzó con un espacio en blanco antes de imprimir la segunda columna (y el resto). Como solo tengo 1 punto de reputación, no puedo comentarlo, así que aquí va como una nueva respuesta:
comience con "out" como la segunda columna y luego agregue todas las otras columnas (si existen). Esto funciona bien siempre que haya una segunda columna.
fuente
La mayoría de las soluciones con awk dejan un espacio. Las opciones aquí evitan ese problema.
Opción 1
Una solución de corte simple (funciona solo con delimitadores individuales):
opcion 2
Forzar una recalibración de awk a veces elimina el espacio inicial agregado (OFS) que queda al eliminar los primeros campos (funciona con algunas versiones de awk):
Opción 3
Imprimir cada campo formateado con
printf
dará más control:Sin embargo, todas las respuestas anteriores cambian todos los FS repetidos entre campos a OFS. Construyamos un par de opciones que no hacen eso.
Opción 4 (recomendada)
Un bucle con sub para eliminar campos y delimitadores en el frente.
Y utilizando el valor de FS en lugar de espacio (que podría modificarse).
Es más portátil, y no provoca un cambio de FS a OFS: NOTA: El
^[FS]*
es aceptar una entrada con espacios iniciales.Opción 5
Es bastante posible construir una solución que no agregue espacios en blanco adicionales (iniciales o finales) y que conserve los espacios en blanco existentes utilizando la función
gensub
de GNU awk, ya que esto:También se puede usar para intercambiar un grupo de campos dado un recuento
n
:Por supuesto, en tal caso, el OFS se usa para separar ambas partes de la línea, y el espacio en blanco final de los campos todavía se imprime.
NOTA:
[FS]*
se utiliza para permitir espacios iniciales en la línea de entrada.fuente
Personalmente probé todas las respuestas mencionadas anteriormente, pero la mayoría de ellas eran un poco complejas o simplemente no eran correctas. La forma más fácil de hacerlo desde mi punto de vista es:
Donde -F "" define el delimitador para que awk lo use. En mi caso es el espacio en blanco, que también es el delimitador predeterminado para awk. Esto significa que -F "" puede ignorarse.
Donde NF define el número total de campos / columnas. Por lo tanto, el bucle comenzará desde el cuarto campo hasta el último campo / columna.
Donde $ N recupera el valor del enésimo campo. Por lo tanto, print $ i imprimirá el campo / columna actual en función del recuento de bucles.
fuente
lauhub propuso esta solución correcta, simple y rápida aquí
fuente
Esto me irritaba tanto, me senté y escribí un
cut
analizador de especificación de campo similar, probado con GNU Awk 3.1.7.Primero, cree un nuevo script de biblioteca Awk llamado
pfcut
, por ejemploLuego, pegue el script a continuación y guárdelo. Después de eso, así es como se ve el uso:
Para evitar escribir todo eso, supongo que lo mejor que se puede hacer (ver lo contrario ¿ Cargar automáticamente una función de usuario al inicio con awk? - Unix & Linux Stack Exchange ) es agregar un alias a
~/.bashrc
; por ejemplo con:... entonces puedes simplemente llamar:
Aquí está la fuente del
pfcut
guión:fuente
cut
, noawk
Imprimir columnas a partir del n. ° 2 (la salida no tendrá espacio final al principio):
fuente
+
después del espacio, ya que los campos pueden estar separados por más de 1 espacio (awk
trata múltiples espacios adyacentes como un solo separador). Además,awk
ignorará los espacios iniciales, por lo que debe comenzar la expresión regular con^[ ]*
. Con el espacio como separador, incluso podría generalizar la solución; por ejemplo, lo siguiente devuelve todo desde el tercer campo:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'
sin embargo, se vuelve más complicado con separadores de campo arbitrarios.¿Funcionaría esto?
Sin embargo, deja algo de espacio en blanco en el frente.
fuente
este usa awk para imprimir todo excepto el último campo
fuente
Esto es lo que preferí de todas las recomendaciones:
Impresión de la 6ta a la última columna.
o
fuente
Si necesita columnas específicas impresas con delimitador arbitrario:
Entonces, si tiene espacios en blanco en una columna, serán dos columnas, pero puede conectarlo con cualquier delimitador o sin él.
fuente
Solución Perl:
Se utilizan estas opciones de línea de comandos:
-n
recorra cada línea del archivo de entrada, no imprima automáticamente cada línea-l
elimina las nuevas líneas antes del procesamiento y las agrega nuevamente-a
modo de división automática: divide las líneas de entrada en la matriz @F. Por defecto se divide en espacios en blanco-e
ejecuta el código perlsplice @F,0,1
elimina limpiamente la columna 0 de la matriz @Fjoin " ",@F
une los elementos de la matriz @F, utilizando un espacio entre cada elementoSolución de Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file
fuente
Si no desea volver a formatear la parte de la línea que no corta, la mejor solución que se me ocurre está escrita en mi respuesta en:
¿Cómo imprimir todas las columnas después de un número particular usando awk?
Corta lo que está antes del número de campo dado N, e imprime todo el resto de la línea, incluido el número de campo N y mantiene el espacio original (no formatea). No importa si la cadena del campo aparece también en otro lugar de la línea.
Definir una función:
Y úsalo así:
La salida mantiene todo, incluidos los espacios finales
En tu caso particular:
Si su archivo / secuencia no contiene caracteres de nueva línea en el medio de las líneas (podría estar usando un Separador de registro diferente), puede usar:
El primer caso fallará solo en archivos / secuencias que contienen el raro carácter hexadecimal número 1
fuente
Esto funcionaría si está usando Bash y podría usar tantas 'x' como elementos que desee descartar e ignora múltiples espacios si no se escapan.
fuente
Perl:
fuente
Esta
awk
función devuelve una subcadena$0
que incluye campos debegin
aend
:Para obtener todo a partir del campo 3:
Para obtener una sección
$0
que cubre los campos 3 a 5:b, e, p, i
sin sentido en la lista de parámetros de función es solo unaawk
forma de declarar variables locales.fuente
Quiero extender las respuestas propuestas a la situación en la que los campos están delimitados posiblemente por varios espacios en blanco ,
cut
supongo que la razón por la cual el OP no está utilizando .Sé que el OP preguntó
awk
, pero unsed
enfoque funcionaría aquí (ejemplo con columnas de impresión del 5 al último):enfoque de sed puro
Explicación:
s///
se usa la forma estándar para realizar la sustitución^\s*
coincide con cualquier espacio en blanco consecutivo al comienzo de la línea\S+\s+
significa una columna de datos (caracteres que no son espacios en blanco seguidos de caracteres en espacios en blanco)(){4}
significa que el patrón se repite 4 veces.sed y corte
simplemente reemplazando espacios en blanco consecutivos por una sola pestaña;
tr y corte:
tr
también se puede usar para exprimir caracteres consecutivos con la-s
opción.fuente
Los ejemplos de Awk parecen complejos aquí, aquí hay una sintaxis simple de shell Bash:
Donde
1
es su n º conteo columna desde 0.Ejemplo
Dado este contenido de archivo (
in.txt
):Aquí está la salida:
fuente
No estaba contento con ninguna de las
awk
soluciones presentadas aquí porque quería extraer las primeras columnas y luego imprimir el resto, así que recurrí a ellasperl
. El siguiente código extrae las dos primeras columnas y muestra el resto tal como está:La ventaja en comparación con la
perl
solución de Chris Koknat es que realmente solo los primeros n elementos se separan de la cadena de entrada; el resto de la cadena no se divide en absoluto y, por lo tanto, permanece completamente intacto. Mi ejemplo demuestra esto con una mezcla de espacios y pestañas.Para cambiar la cantidad de columnas que se deben extraer, reemplace
3
en el ejemplo con n + 1.fuente
De esta respuesta no está mal, pero el espacio natural se ha ido.
Por favor, compárelo con este:
Entonces verías la diferencia.
Incluso
ls -la | awk '{$1=$2=""; print}'
que se basa en la respuesta votada mejor hasta ahora no es preservar el formato.Por lo tanto, usaría lo siguiente, y también permite columnas selectivas explícitas al principio:
Tenga en cuenta que cada espacio también cuenta para las columnas, por lo que, por ejemplo, a continuación, las columnas 1 y 3 están vacías, 2 es INFO y 4 es:
fuente
Si desea texto formateado, encadene sus comandos con echo y use $ 0 para imprimir el último campo.
Ejemplo:
Huellas dactilares:
fuente
Debido a una respuesta equivocada con más votos con 340 votos, ¡acabo de perder 5 minutos de mi vida! ¿Alguien intentó esta respuesta antes de votar esto? Aparentemente no. Completamente inutil.
Tengo un registro donde después de $ 5 con una dirección IP puede haber más texto o no texto. Necesito todo, desde la dirección IP hasta el final de la línea, si hubiera algo después de $ 5. En mi caso, esto es realmente dentro de un programa awk, no un awk oneliner, por lo que awk debe resolver el problema. Cuando trato de eliminar los primeros 4 campos usando la respuesta más votada pero completamente incorrecta:
escupe una respuesta incorrecta e inútil (agregué [..] para demostrar):
Incluso hay algunas sugerencias para combinar substr con esta respuesta incorrecta. Como esa complicación es una mejora.
En cambio, si las columnas tienen un ancho fijo hasta que se necesita el punto de corte y awk, la respuesta correcta es:
que produce la salida deseada:
fuente