web-dev-qa-db-fra.com

Rediriger la sortie filtrée vers le fichier

Je redirige ma sortie dans un fichier et j'obtiens quelque chose comme ceci:

|  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)

Comment puis-je le convertir en style csv comme:

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

Pour obtenir le premier fichier, la boucle s'exécute et démarre les scripts SQL. Tout ce que je fais, c'est simplement > file. Mais je n'ai aucun contrôle sur la boucle. Probablement, les informations peuvent déjà être filtrées lors de l'itération. Mais c'est plutôt douteux.

4
user1648825

awk:

awk 'NR==1; /^\|[0-9]/'
  • L’action par défaut dans awk consiste à imprimer l’enregistrement.

  • NR==1 correspond au premier enregistrement (ligne)

  • /^\|[0-9]/ correspond à tout enregistrement commençant par | suivi d'un chiffre

Exemple:

% 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    |
6
heemayl

Vous pouvez diriger votre sortie à travers cette commande sed:

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

Explication:

  • L'expression 1p fait simplement écho à la première ligne.
  • L'expression /^|/!d supprime toute ligne ne commençant pas par |.
  • L'expression /^|\s*id/d supprime toute ligne commençant par |, puis certains (ou aucun) espaces, suivis de id. Nous avons déjà imprimé notre en-tête en utilisant la première expression. Il est donc normal que cette expression le supprime maintenant.
5
Melebius

Vous pouvez utiliser sed pour n’imprimer que ce que vous voulez.

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

Explication

-n n'imprime rien tant que nous ne le demandons pas
1p imprimer la première ligne
^|[0-9]/p imprime la ligne si elle commence par | suivie d'un nombre

3
Zanna

Voici un petit script Perl que vous pouvez utiliser pour cela:

#!/usr/bin/Perl
use strict;
use warnings;

my$file="file.txt";

open(IN,"<",$file); 
my$head=<IN>; 
print $head; 
while(<IN>)
{
  print $_ if $_=~/^\|\S+/;
} 
close IN;

Ceci imprimera la première ligne de votre fichier d’entrée en tant qu’en-tête, puis parcourra le reste du fichier et imprimera les lignes de contenu.

Note:

Je suppose ici que vos lignes de contenu commencent toujours par un symbole de conduite, suivi d'un ou plusieurs caractères autres que des espaces (|\S+). S'il vous plaît laissez-moi un commentaire si ce n'est pas le cas, alors je peux ajuster la regex.

1
Wayne_Yux
your_command | grep "|"

se débarrasser de ceux (2 lignes) et ligne vide. Vous pouvez ajouter un autre "id" de grep -v qui supprimera tous les en-têtes. Il vous suffira ensuite d'ajouter un en-tête avec la commande echo au début.

1
marosg

Que diriez-vous de ce petit script shell? Il utilise la réponse de user596137 avec grep et écrit la sortie dans ce fichier.

#!/bin/bash

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

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

Enregistrez ce script et accordez-lui une autorisation d'exécution. Ce script nécessite un nom de fichier en tant que premier paramètre.

1
Kev Inski