Dans mon fichier texte, il y a 6 lignes dans un groupe séparées par deux lignes vides. J'ai imprimé le numéro de ligne de chaque ligne dans le document texte.
grep -vn \| song.txt
Actuellement, seuls 80 caractères sont imprimés sur une ligne, donc le reste des données continue dans le groupe suivant. Par exemple, la ligne 365 correspond à la ligne 373.
Pour les seules lignes qui ne contiennent pas de barre verticale (c'est-à-dire les lignes 365-370), j'essaye de 1) ajouter la ligne à 8 lignes , puis 2) supprimez la ligne ajoutée après son impression.
Donc, idéalement:
365:----------------------------------------------------------------------------------------------------------------------------------------------------| 366:----------------------------------------------------------------------------------------------------------------------------------------------------| 367:--------------------------------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------| 368:--------------------------------------------------------------------------x--------2-----------------------------------------------------2----------| 369:--------------------4-------------------------------------------------------------------------------------------------------------------------------| 370:--0-------------------------------------------------------------------------------------------------------------------------------------------------|
Je peux isoler les lignes qui ne contiennent pas de barre verticale utilisant grep
365:-------------------------------------------------------------------------------- 366:-------------------------------------------------------------------------------- 367:-------------------------------------------------------------------------------- 368:--------------------------------------------------------------------------x----- 369:--------------------4----------------------------------------------------------- 370:--0----------------------------------------------------------------------------- 371: 372: 373:--------------------------------------------------------------------| 374:--------------------------------------------------------------------| 375:------------0--------2--------3h----2h----0-----2-------------------| 376:---2-----------------------------------------------------2----------| 377:--------------------------------------------------------------------| 378:--------------------------------------------------------------------|
Je sais que SED ou AWK sont probablement mon meilleur pari, mais je ne sais pas comment procéder à partir de là.
4 Réponses :
Un peu moche, mais ça marche:
Divisez votre saisie:
paste -d "" file1 file2
Et rassemblez-la:
egrep -v "^$|\|" song.txt >file1 egrep "\|" song.txt >file2
J'utilise généralement le programme vim
pour ce type de travail. Par exemple, en supposant que vous ayez un fichier nommé nom_fichier.txt
avec le contenu suivant
-------------------------8-------------------984asds--------| ------------0--------2--------| ---2--------------------------| ------------------aaa---------| ---------t6776----------------|
avec la commande suivante
vim -c ":6y" -c ":put" -c ":1" -c ":join!" -c ":6d" -c ":wq" file_name.txt
le programme ouvre nom_fichier.txt
sur la première ligne, copiez la sixième ligne, collez le contenu copié dans la deuxième ligne (la ligne suivante), allez à la première ligne, rejoint la première ligne avec la seconde, supprimez la ligne qui a été copiée (sixième ligne), enregistrez et fermez le fichier. De cette façon, cette commande produit le résultat suivant
-------------------------8---- ------------0--------2--------| ---2--------------------------| ------------------aaa---------| ---------------984asds--------| ---------t6776----------------|
Il suffit de masser cette approche en fonction de:
$ awk '!NF{next} ++cnt>6{print a[NR%6] $0} {a[NR%6]=$0}' file --------------------------------------------------------------------------------------------------------------------------------------------------| -------------------------------------------------------------------------x------------------------------------------------------------------------| -------------------4----------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------| -0-------------------------------------------------------------------------------2-----------------------------------------------------2----------| --------------------------------------------------------------------------------------------------------------------------------------------------| --------------------------------------------------------------------------------------------------------------------------------------------------|
par ex. en supposant 2 lignes vides à la fin de votre saisie pour en faire des blocs de 8 lignes:
$ awk 'NR>8{print a[NR%8] $0} {a[NR%8]=$0}' file --------------------------------------------------------------------------------------------------------------------------------------------------| --------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------| -------------------------------------------------------------------------x-------2-----------------------------------------------------2----------| -------------------4------------------------------------------------------------------------------------------------------------------------------| -0------------------------------------------------------------------------------------------------------------------------------------------------|
ou si vous n'avez pas ces lignes vides après le dernier bloc: p>
$ seq 16 | awk 'NR>8{print a[NR%8], $0} {a[NR%8]=$0}' 1 9 2 10 3 11 4 12 5 13 6 14 7 15 8 16
Cela pourrait fonctionner pour vous (utils GNU);
sed '/^$/d' file | split -nr/6 --filter 'cat'| paste -sd'\0'| sed 's/|/&\n/g;s/\n$//'
Cela supprime toutes les lignes vides en utilisant sed, divise le fichier en 6 en utilisant une méthode round-robin et au lieu de créer des fichiers séparés, renvoie tous les fichiers entrelacés dans la sortie standard. Les lignes sont ensuite collées en de longues lignes (une par chaîne) et divisées en lignes plus courtes en utilisant |
comme séparateurs d'enregistrement.
Veuillez ajouter un exemple d'entrée et la sortie souhaitée pour cet exemple d'entrée à votre question.
Cela devrait-il être fait sur toutes les lignes, uniquement les lignes commençant par -, uniquement les lignes 365-370, une autre sélection?
Comme dans la vie, dans les logiciels, il est beaucoup plus facile de faire les choses en fonction de ce qui s'est passé que de ce qui va se passer. Donc, ne pensez pas que votre problème doit ajouter la ligne 8 lignes plus tard, pensez-y comme devant ajouter la ligne 8 lignes plus tôt - cela devrait rendre la solution beaucoup plus évidente.
@Cyrus ajouté! Merci pour la suggestion. Nouveau ici.
@JimDanner seules les lignes sans la barre verticale doivent être ajoutées par la ligne qui est 8 lignes plus tard