4 votos

Redirigir filtrada salida a un archivo

Yo redirigir mi salida en un archivo y me sale algo como esto:

|  id  | code | color_code | 
-------+------+------------+
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |
(2 rows)

¿Cómo puedo convertir en csv estilo como:

|  id  | code | color_code | 
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |

Para obtener el primer archivo del bucle se ejecuta y comienza secuencias de comandos sql. Todo lo que hago es simplemente > file. Pero no tengo control sobre el bucle. Probablemente info ya puede ser filtrada durante la iteración. Pero esto es bastante dudoso.

6voto

heemayl Puntos 21116

awk:

awk 'NR==1; /^\|[0-9]/'
  • La acción predeterminada en awk es para imprimir el registro de

  • NR==1 coincide con el primer registro (línea)

  • /^\|[0-9]/ coincide con cualquier marca a partir del con | , seguido por un dígito

Ejemplo:

% cat file.txt                    
|  id  | code | color_code | 
-------+------+------------+
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |
(2 rows)

% awk 'NR==1; /^\|[0-9]/' file.txt
|  id  | code | color_code | 
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |

5voto

Melebius Puntos 141

Se puede canalizar su salida a través de este sed comando:

sed '1p;/^|/!d;/^|\s*id/d'

Explicación:

  • La expresión 1p sólo se hace eco de la primera línea.
  • La expresión /^|/!d elimina cualquier línea que no comienzan con |.
  • La expresión /^|\s*id/d elimina cualquier línea que comience con |, a continuación, algunos (o ninguno) de los caracteres de espacio en blanco seguido por id. Ya hemos impreso nuestro encabezado el uso de la primera expresión, por lo que es ACEPTAR que esta expresión se descarta ahora.

3voto

Zanna Puntos 502

Usted puede utilizar sed para imprimir sólo las cosas que usted desea

sed -n '1p; /^|[0-9]/p' file

-n no imprimir nada hasta que le pedimos
1p de impresión de la primera línea
^|[0-9]/p de impresión de la línea si se inicia con | , seguido de un número

1voto

Predator Puntos 4000
your_command | grep "|"

deshacerse de esos (2 filas) y la línea de vacío. Usted puede agregar otro grep -v "id", el cual va a quitar todos los encabezados, a continuación, sólo tiene que añadir una cabecera con el comando echo para el comienzo.

1voto

Kev Inski Puntos 344

Cómo acerca de este pequeño shell-script? Utiliza user596137 la respuesta de con grep y escribe el resultado en el archivo

#!/bin/bash

FILE=$1
FIRST_LINE=`head -n1 ${FILE}`
INPUT=`cat ${FILE} | grep "|" | grep -v "id"`

echo "$FIRST_LINE" > $FILE; echo "$INPUT" >> $FILE

Guardar el script y conceder permisos de ejecución. Este script necesita un nombre de archivo como el primer parámetro.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: