1
votes

Ajouter puis supprimer une ligne à une autre ligne, uniquement si elle ne contient pas de caractère

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à.


5 commentaires

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


4 Réponses :


0
votes

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


0 commentaires

0
votes

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


0 commentaires

2
votes

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


0 commentaires

0
votes

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.


0 commentaires