una rapido para mas linea ingles hacer dibujar cortes corte cortar como comando unix awk cut

unix - rapido - como hacer cortes en autocad 3d



Cómo obtener el segundo campo pasado de un comando de corte (6)

Tengo un conjunto de datos como entrada y necesito el segundo campo más reciente basado en deleimiter. Las líneas pueden tener diferentes números de delimitador. ¿Cómo puedo obtener el segundo campo?

entrada de ejemplo

text,blah,blaah,foo this,is,another,text,line

Rendimiento esperado

blaah text


La respuesta más minimalista a este problema es usar mi utilidad de cuts :

$ cat file.txt text,blah,blaah,foo this,is,another,text,line $ cuts -2 file.txt blaah text

cortes , que significa "cortar esteroides":

- automatically figures out the input field separators - supports multi-char (and regexp) separators - automatically pastes (side-by-side) multiple columns from multiple files - supports negative offsets (from end of line) - has good defaults to save typing + allows the user to override them

y mucho más.

Escribí cuts después de haberme sentido frustrado por las demasiadas limitaciones de cut en Unix. Está diseñado para reemplazar varios combos de cut / paste , cortar y cortar en cubos columnas de múltiples archivos, con múltiples variaciones de separador, al mismo tiempo que impone una escritura mínima del usuario.

Puede obtener cuts (software libre, licencia artística) de github: https://github.com/arielf/cuts/

Los cuts llamadas sin argumentos imprimirán un mensaje de Usage detallado.


Awk se adapta bien para esto:

awk -F, ''{print $(NF-1)}'' file

La variable NF es una variable awk especial que contiene el número de campos en el registro actual.


Código para GNU sed :

$ echo text,blah,blaah,foo|sed -r ''s/^(/S+,){2}(/S+),.*//2/'' blaah $ echo this,is,another,text,line|sed -r ''s/^(/S+,){2}(/S+),.*//2/'' text

Ejemplo de código similar al code awk de sudo_O:

$ sed -r ''s/.*,(/w+),/w+$//1/'' file blaah text

Puede ser mejor usar programas más especializados para archivos CSV , ej. awk o excel


No es necesario usar herramientas de cut , rev o cualquier otra herramienta externa para bash aquí. Simplemente lea cada línea en una matriz y elija la que desee:

while IFS=, read -r -a entries; do printf ''%s/n'' "${entries[${#entries[@]} - 2]}" done <file

Hacer esto en pure bash es mucho más rápido que iniciar una tubería, al menos para entradas razonablemente pequeñas. Para grandes entradas, la mejor herramienta es awk.



Solución Perl similar a la solución awk de @iiSeymour

perl -lane ''print $F[-2]'' file

Estas opciones de línea de comando se usan:

  • n bucle alrededor de cada línea del archivo de entrada, no imprima automáticamente cada línea

  • Elimino las líneas nuevas antes de procesarlas y las vuelvo a agregar después

  • a modo autosplit - divide las líneas de entrada en la matriz @F. Se predetermina a la división en espacios en blanco

  • e ejecuta el código perl

La matriz @F autosplit comienza en el índice [0] mientras que los campos awk comienzan en $ 1
-1 es el último elemento
-2 es el penúltimo elemento