cortar la columna 2 del archivo de texto


15

Mi archivo de texto no tiene delimitador para especificar separadores solo espacios, ¿cómo corto la columna 2 al archivo de salida,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Entonces la salida que necesito es

207
412
432

Respuestas:


13

Es más fácil con el awkque trata múltiples espacios consecutivos como uno solo, por lo que

awk '{print $2}' file

huellas dactilares

207
412
431

Pero obviamente, hay muchas, muchas otras herramientas que harán el trabajo, incluso no diseñadas para tareas como grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

Use tuberías para enviar sus datos (p. Ej., Cat columnas.txt) en corte.

cat columns.txt | cut -d" " -f5

En los datos de ejemplo que proporcionó, un delimitador de espacio único coloca los datos que desea en el campo 5. Para enviar esa salida a otro archivo, utilice la redirección.

cat collumns.txt | cut -d" " -f5 > field2.txt

Usando el comando awk podría hacer algo como lo siguiente que reconoce automáticamente el campo que está buscando porque hay datos allí (?) Necesito aprender más sobre awk.

awk -F' ' '{print $2}' columns.txt

3
El encantamiento cat ... |rara vez es necesario. La mayoría de los comandos de Unix, como cuttomar uno o más archivos de entrada como argumentos, por ejemplo cut -d" " -f5 columns.txt.
Denis Howe

1

como @jimmij dijo, awk '{print $2}' filees la respuesta más simple.

Si, por alguna razón, no desea usar awke insiste en usar cut, puede usar sedpara convertir cada instancia de dos o más espacios en una sola pestaña ( cutdelimitador predeterminado) antes de cortar en corte:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

Todavía puede usar espacios individuales como delimitador, solo tendrá más columnas. Aumente el valor que le da cut -d' ' -fde 2 a 5, o tal vez 6. Incremente el número hasta obtener los resultados deseados.


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

El anterior es muy útil cuando las utilidades de Linux como awk para extracción de datos no funcionan si está cambiando a usuario "root" dentro de un script de shell como el siguiente:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
La única razón por la que " awkno funcionará" en su ejemplo es que el documento aquí no está entre comillas, lo que significa $2que el shell lo expandirá al segundo parámetro posicional. La solución probablemente no sea cambiar a un grepcomando, sino escapar del $in $2como \$2o simplemente citar todo el documento utilizando <<'EOF'en lugar de <<EOF. También tenga en cuenta que la tarea en su ejemplo se lleva a cabo más simplemente por pgrep.
Kusalananda

Muchas gracias @Kusalananda. Funcionó a las mil maravillas.
Alok Tiwari
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.