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.
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 |
Vous pouvez diriger votre sortie à travers cette commande sed
:
sed '1p;/^|/!d;/^|\s*id/d'
Explication:
1p
fait simplement écho à la première ligne./^|/!d
supprime toute ligne ne commençant pas par |
./^|\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.Vous pouvez utiliser sed
pour n’imprimer que ce que vous voulez.
sed -n '1p; /^|[0-9]/p' file
-n
n'imprime rien tant que nous ne le demandons pas1p
imprimer la première ligne^|[0-9]/p
imprime la ligne si elle commence par |
suivie d'un nombre
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.
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.
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.