Sed/Awk - tirez les lignes entre les modèles x et y
J'ai des gros fichiers CSV où je voudrais extraire toutes les données entre la Ligne X qui inclut le modèle " x "et la Ligne Y qui comprend le motif de "y"
Par exemple:
other_data
Header
data
data
data
Footer
other_data
Je veux être en mesure de pipe tout ce qui est entre (et y compris) de la Tête -> Pied de page dans un nouveau fichier.
Merci!
OriginalL'auteur Numpty | 2013-04-02
Vous devez vous connecter pour publier un commentaire.
À l'aide de
awk
c'est assez simple:Fondamentalement, garder de l'état dans une variable nommée
show
. Lorsque nous avons atteint l'en-Tête nous nous tournons sur, Pied de page, nous l'éteindre. Alors qu'il est sur leshow
règle s'exécute l'action par défaut de l'impression de l'enregistrement.+1 car c'est LA bonne réponse car il est facilement amélioré pour couvrir les situations où vous souhaitez imprimer la première ou de la dernière ligne ou deux lignes ou de toute autre chose que vous voulez faire. Les solutions à l'aide de /start/,/fin/ les plages, tandis que légèrement plus courtes écrouler au moindre changement des exigences - que modèle, les solutions triviales problèmes légèrement plus courts, mais les solutions non-triviales des problèmes BEAUCOUP plus longue et complexe ou nécessitant une ré-écriture de ce style.
OriginalL'auteur FatalError
C'est assez simple en sed:
ou
J'ai trouvé la première option (la
/p
fin) de prendre 1/4 du temps comme le awk solution. La deuxième option (/!d
) a pris la même quantité de temps que awk. Dans un gros fichier, il commence à la matière.Cela fonctionne aussi lorsque le séparateur est le même. Le
awk
version ne fonctionne que quand ils sont différents.puisque nous ne savons pas ce que le comportement attendu est lorsque le séparateur est la même, vous ne pouvez pas dire que ce soit la solution fonctionne ou ne fonctionne pas. De même, si les deux délimiteurs de se produire sur la même ligne et/ou de l'ensemble d'entrée est une seule ligne et/ou si le délimiteur est une sous-chaîne de l'autre et/ou contient des regexp metachars et/ou il peut y avoir un nombre différent de départ par rapport à fin délimiteurs, et/ou de cent autres choses qui ne sont pas ce que cette question a été sur.
le comportement est très clairement expliqué en vertu de l'article
Addresses
dansman sed
. Elle correspondait à mon comportement attendu donc j'ai pensé qu'il est suffisamment pertinent de mettre une note à ce sujet. Pas sûr de ce qui vous ennuie.OriginalL'auteur Beta
D'une autre façon avec
awk
:Suffit de rediriger la sortie d'enregistrer dans un newfile:
Oui, cela ressemble le mieux. +1.
Je suis curieux de savoir: est-il "de l'en-Tête jusqu'à la fin du fichier" en utilisant ce genre de modèle? (C'est très facile en utilisant le haut awk solution, mais vous vous demandez si il y a une "fin de fichier" marqueur, au lieu de "/Pied de page/")
OriginalL'auteur Chris Seymour
Cela pourrait fonctionner pour vous (GNU sed):
OriginalL'auteur potong