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.
Recibí una pista del corte de Unix, excepto las últimas dos fichas, y pude descubrir la respuesta:
cat datafile | rev | cut -d ''/'' -f 2 | rev
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íneaElimino 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 blancoe
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