J'ai un fichier nommé Element_query
contenant le résultat d'une requête:
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
Je veux supprimer la 1ère ligne et la dernière ligne en utilisant la commande shell.
Réponses:
Utilisation de GNU
sed
:Comment ça marche :
-i
option modifier le fichier lui-même. Vous pouvez également supprimer cette option et rediriger la sortie vers un nouveau fichier ou une autre commande si vous le souhaitez.1d
supprime la première ligne (1
pour agir uniquement sur la première ligne,d
pour la supprimer)$d
supprime la dernière ligne ($
pour agir uniquement sur la dernière ligne,d
pour la supprimer)Aller plus loin :
1,5d
supprimerait les 5 premières lignes.SQL>
utilisation de l'instruction/^SQL> /d
/^$/d
statement1;statement2;satement3;...
) ou en les spécifiant séparément sur la ligne de commande (-e 'statement1' -e 'statement 2' ...
)la source
1,3d
supprimera les trois premières lignes) mais c'est un peu plus difficile pour la fin. Selon ce que vous voulez, vous pourriez être mieux en utilisant ceci:sed -i '/^SQL> /d' Element_query
pour supprimer les lignes qui commencentSQL>
peu importe où elles se trouvent dans le fichier.sed
unique - qui fonctionnera pour supprimer le nombre de lignes arbitraires de la tête et de la queue d'un fichier, Mieux cependant, tant que l'entrée est un fichier normal, il suffit de regrouper une seule entrée sur deuxhead
processus - c'est la moyen le plus rapide de le faire habituellement.sed -i '1d' table-backup.sql
de supprimer la première ligne du fichier texte sqltête; tête
Avec ce qui précède, vous pouvez spécifier le premier nombre de lignes à retirer de la tête de la sortie avec la première
head
commande, et le nombre de lignes à écrireoutfile
avec la seconde. Il le fera également généralement plus rapidement quesed
- en particulier lorsque l'entrée est volumineuse - bien qu'il nécessite deux appels. Oùsed
certainement devrait être préféré cependant, est dans le cas qui<infile
est pas régulièrement, lseekable fichier - car cela généralement pas fonctionner comme prévu dans ce cas, maissed
peut gérer toutes les modifications de sortie dans un seul processus scénarisé.Avec un GNU,
head
vous pouvez également utiliser la-
forme négative pour[num]
dans la deuxième commande. Dans ce cas, la commande suivante supprimera la première et la dernière ligne de l'entrée:OU avec un POSIX
sed
:Supposons, par exemple, que je lisais une entrée de 20 lignes et que je voulais supprimer les 3 premiers et les 7 derniers. Si je décidais de le faire avec
sed
, je le ferais avec un tampon de queue. Je voudrais d'abord additionner trois et sept pour un nombre total de bandes de dix, puis faire:C'est un exemple qui supprime les 3 et 7 dernières lignes de l'entrée. L'idée est que vous pouvez mettre en mémoire tampon autant de lignes que vous souhaitez supprimer de la queue de l'entrée dans l'espace de motif sur une pile, mais seulement
P
réimprimer la première de celles-ci pour chaque ligne tirée.1,10
sed
P
n'imprime rien car pour chacun d'entre eux, il empile les entrées ligne par ligne dans un espace de motif dans uneb
boucle ranch.sed
la pile estd
terminée - et donc les 3 premières lignes sont supprimées de la sortie en un seul coup.sed
atteint la$
dernière ligne d'entrée et tente d'extraire l'N
extension, il frappe EOF et arrête complètement le traitement. Mais à ce moment-là, l'espace de motif contient toutes les lignes14,20
- dont aucune n'a encore étéP
imprimée, et ne le sont jamais.sed
P
ne s'imprime que jusqu'à la première ligne\n
électronique apparaissant dans l'espace de motif, et lesD
supprime avant de commencer un nouveau cycle avec ce qui reste - ou les 6 lignes d'entrée suivantes. La 7ème ligne est à nouveau ajoutée à la pile avec laN
commande ext dans le nouveau cycle.Et donc, de
seq
la sortie de (qui est 20 lignes numérotées séquentiellement) ,sed
imprime uniquement:Cela devient problématique lorsque le nombre de lignes que vous souhaitez supprimer de la queue d'entrée est important, car
sed
les performances de sont directement proportionnelles à la taille de son espace de motif. Pourtant, c'est une solution viable dans de nombreux cas - et POSIX spécifie unsed
espace de modèle pour gérer au moins 4 Ko avant de se casser.la source
tail
prend également en charge latail -n+<num>
syntaxe étendue signifiant «commencer à partir de la ligne<num>
»Je ne vais pas vous dire comment supprimer un certain nombre de lignes. Je vais attaquer le problème de cette façon:
grep -v '#SQL>' Element_query >outfile
Au lieu de compter les lignes, il élimine les commandes SQL en reconnaissant les invites. Cette solution peut ensuite être généralisée pour d'autres fichiers de sortie de sessions SQL avec plus de commandes que deux.
la source
ed
est «l'éditeur de texte standard» et devrait être disponible sur les systèmes qui n'ont pas GNUsed
. Il a été initialement conçu comme un éditeur de texte, mais il est bien adapté aux scripts.1d
supprime la première ligne du fichier,$d
(citée pour que le shell ne pense pas que ce soit une variable) supprime la dernière ligne,w
écrit le fichier etq
quitteed
.printf
est ici utilisé pour formater les commandes deed
- chacune doit être suivie d'une nouvelle ligne; il existe bien sûr d'autres moyens d'y parvenir.la source
Il existe plusieurs façons de supprimer les lignes de début et de fin d'un fichier.
Vous pouvez l'utiliser
awk
car il gère à la fois la correspondance de motifs et le comptage de lignes,Vous pouvez utiliser
grep -v
pour exclure les lignes que vous ne voulez pas par motif, et vous pouvez faire correspondre plusieurs motifs en utilisant l'-E
option,Vous pouvez utiliser
head
ettail
pour découper des nombres spécifiques de lignes,Vous pouvez utiliser
vi/vim
et supprimer les première et dernière ligne (s),vous pouvez utiliser un script perl, sauter la première ligne, enregistrer chaque ligne, imprimer lorsque vous obtenez une ligne suivante,
la source
head
s, vous n'avez pas vraiment besoin du tuyau, et, en fait, il vaut mieux ne pas l'utiliser du tout si vous pouvez vous en tirer. Lorsque vous le faiteshead | head
, bien que les deux processus puissent s'exécuter simultanément, ils traitent également pratiquement tous les mêmes données de manière redondante. Si vous le faites à la place,{ head >dump; head >save; } <in
vous ne sautez que par décalage - le premier lit 10 lignes>dump
et le second lit les 10 lignes suivantes>save
.Vous seriez bien mieux servi en supprimant les commandes SQL. Vous pouvez le faire de deux manières:
Si vous êtes absolument sûr que la séquence "
SQL>
" ne se produit nulle part ailleurs dans la sortie,Si vous n'êtes pas aussi sûr,
La deuxième version est plus lente mais plus précise: elle ignorera les lignes commençant exactement par "SQL>" et se terminant par un point-virgule, qui semblent décrire les lignes que vous souhaitez éliminer.
Cependant, il serait préférable de ne pas mettre cette sortie supplémentaire dans le fichier pour commencer. La plupart des systèmes SQL ont cette possibilité. Je ne connais pas trop Oracle, mais cette réponse pourrait peut-être être utile.
la source
Vous pouvez sélectionner les lignes entre une plage
awk
(cela suppose que vous connaissez le nombre de lignes):Ou en Perl:
Si vous ne savez pas combien de lignes il y a, vous pouvez le calculer à la volée en utilisant
grep
(notez que cela ne comptera pas les lignes vides, utilisez-lesgrep -c '' file
pour les compter également):la source
Essayez cette solution:
Personnalisation
Vous pouvez facilement l'adapter pour supprimer les n premières lignes en changeant le
+2
oftail
;ou pour supprimer les n dernières lignes en changeant le
-1
dehead
.la source
En utilisant
awk
:< inputfile
: redirige le contenu deinputfile
versawk
« sstdin
> outputfile
: Réoriente le contenu deawk
« sstdout
versoutputfile
NR>1
: exécute les actions suivantes uniquement si le numéro de l'enregistrement en cours de traitement est supérieur à 1{print r}
: imprime le contenu de la variabler
{r=$0}
: affecte le contenu de l'enregistrement en cours de traitement à la variabler
Ainsi, lors de la première exécution du
awk
script, le premier bloc d'actions n'est pas exécuté, tandis que le deuxième bloc d'actions est exécuté et le contenu de l'enregistrement est affecté à la variabler
; à la deuxième exécution, le premier bloc d'actions est exécuté, et le contenu de la variabler
est imprimé (donc l'enregistrement précédent est imprimé); cela a pour effet d'imprimer chaque ligne traitée mais la première et la dernière.la source
r
.