Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/03/2020, à 10:07

judkil

AWK déplacer les lignes d'un fichier vers le bas

Bonjour,


Je possède
input

AB-0004 XXX XXX XXX XXX XXX XXX
A8-0005 XXX XXX XXX 
A8-0006 XXX XXX XXX
AB-0007 XXX XXX XXX XXX XXX XXX
AB-0008 XXX XXX XXX 

et j'aimarai obtenir

Output

AB-0004 XXX XXX XXX XXX XXX XXX
AB-0007 XXX XXX XXX XXX XXX XXX
A8-0005 XXX XXX XXX
A8-0005 XXX XXX XXX
AB-0008 XXX XXX XXX 


J'aimerai pouvoir déplacer des lignes d'un fichier vers le bas en fonction du nombre de colonnes que ce soit avec un awk ou un sed, mais sans se baser sur le numéro de la ligne.

Dernière modification par judkil (Le 27/03/2020, à 11:18)

Hors ligne

#2 Le 27/03/2020, à 11:26

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Voici la forme de mon script

awk ' 
BEGIN {
            }
# Je ne vois pas comment lui dire si tu vois un nombre de colonne de 7 
END { 
            { print }
# J'utiliserai un END pour afficher le reste donc les lignes de 4 colonnes
     } ' input > output 

Hors ligne

#3 Le 27/03/2020, à 11:40

pingouinux

Re : AWK déplacer les lignes d'un fichier vers le bas

Bonjour,
Le nombre de colonnes (de champs) est donné par la variable NF (number of fields).

Hors ligne

#4 Le 27/03/2020, à 11:55

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

J'aurai donc quelque chose comme

awk '
BEGIN { if (NF == 7)
        print }
# toutes les lignes à sept colonnes s'affichent
END {
       {print} 
# par défaut, tout les autres lignes s'affichent
}' input > output

Ce code ne marche pas sad, Est ce que quelqu'un aurait une idée ?? smile

Merci beauboup !

Dernière modification par judkil (Le 27/03/2020, à 12:02)

Hors ligne

#5 Le 27/03/2020, à 12:10

pingouinux

Re : AWK déplacer les lignes d'un fichier vers le bas

Je ne suis pas sûr d'avoir compris ce que tu voulais faire.

Ce code ne marche pas

Il faudrait que tu sois plus précis.

Remarques :
- Les ' dans les commentaires fichent la pagaille.
- Le contenu de BEGIN s'exécute avant de lire le fichier, tu ne peux donc pas y tester la longueur des lignes.

Hors ligne

#6 Le 27/03/2020, à 12:20

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Je pars d'un fichier avec des lignes d'un nombre divers de colonnes. J'aimerai que awk place toutes les lignes de 7 colonnes en premiers, puis toutes les lignes de 4 colonnes a la fin.

AB-0004 XXX XXX XXX XXX XXX XXX
A8-0005 XXX XXX XXX 
A8-0006 XXX XXX XXX
AB-0007 XXX XXX XXX XXX XXX XXX
AB-0008 XXX XXX XXX  

output

AB-0004 XXX XXX XXX XXX XXX XXX
AB-0007 XXX XXX XXX XXX XXX XXX
A8-0005 XXX XXX XXX
A8-0005 XXX XXX XXX
AB-0008 XXX XXX XXX 

Hors ligne

#7 Le 27/03/2020, à 12:22

pingouinux

Re : AWK déplacer les lignes d'un fichier vers le bas

Il n'y a dans le fichier que des lignes de 4 ou 7 colonnes ?

Hors ligne

#8 Le 27/03/2020, à 12:28

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Oui tout à fait

Hors ligne

#9 Le 27/03/2020, à 12:33

pingouinux

Re : AWK déplacer les lignes d'un fichier vers le bas

Dans ce cas, tu peux essayer ceci

awk '
{ if (NF == 7) lig7=lig7"\n"$0; else ligs=ligs"\n"$0; }
END {print lig7 ligs}
' input >output

Hors ligne

#10 Le 27/03/2020, à 12:36

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Merci beaucoup ! Ce script a fonctionné !

Hors ligne

#11 Le 27/03/2020, à 13:57

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

salut,

$ gawk 'BEGIN{PROCINFO["sorted_in"]="@ind_num_desc"}{ar[NF][NR]=$0}END{for(i in ar)for(y in ar[i])print ar[i][y]}' fichier.txt
AB-0007 XXX XXX XXX XXX XXX XXX
AB-0004 XXX XXX XXX XXX XXX XXX
AB-0008 XXX XXX XXX 
A8-0006 XXX XXX XXX
A8-0005 XXX XXX XXX

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 27/03/2020, à 15:22

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Merci beaucoup de votre aide ! Dans la continuité, auriez vous une idée de comment appliquer une commande uniquement sur un bloque de ligne, par exemple uniquement de la ligne 3 à 5
J'ai essaié avec ce script

awk'
for ({$i>=3})
 { print $2, $1,
      }
 ' input > output

Hors ligne

#13 Le 27/03/2020, à 15:30

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

tu n'as pas lu ma ligne de commande !?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 27/03/2020, à 15:40

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Oui j'ai lu, mais dans ma version de awk  " @ind_num_desc " ressortira comme une erreur. J'utilise awk et non gawk

Dernière modification par judkil (Le 27/03/2020, à 15:40)

Hors ligne

#15 Le 27/03/2020, à 16:13

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

ce n'est pas cette partie à laquelle il faut faire attention pour répondre à ta dernière question, mais à NR.

EDIT :en mawk

awk '{ar[NF,NR]=$0}END{for(i in ar)print ar[i]}' fichier.txt | tac

NF et NR étant strictement numériques, les indices ne devraient pas être hashés et donc suivre l'ordre donné.
à confirmer.

Dernière modification par Watael (Le 27/03/2020, à 16:34)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 27/03/2020, à 16:41

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Ce code serait pour appliquer des commandes à partir de la ligne 3 ?

Dernière modification par judkil (Le 27/03/2020, à 16:42)

Hors ligne

#17 Le 27/03/2020, à 17:01

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

non. il reprend simplement, en mode POSIX, la commande donnée précédemment.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 27/03/2020, à 17:21

diesel

Re : AWK déplacer les lignes d'un fichier vers le bas

En ce moment, j'ai un peu de temps. J'ai imprimé le man de awk et je vais apprendre à m'en servir.

Dans quelques jours (n < 100 000), vous aurez en face de vous un pro de awk.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#19 Le 27/03/2020, à 17:42

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

le manuel est aride; c'est une référence rapide.
j'ai préféré le GNU Awk User's Guide.
Attention, c'est la version GNU.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 27/03/2020, à 18:56

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Si quelqu'un sait comment appliquer une commande uniquement sur un bloque de ligne, comme par exemple uniquement de la ligne 3 à 5.
Voilà le début de mon script

awk'
for ({$i>=3})
 { print $2, $1,
      }
 ' input > output

  comment je suis preneur ! En awk si possible, pas en gawk si en posix

Hors ligne

#21 Le 27/03/2020, à 19:05

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

qu'est-ce que la variable NR ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#22 Le 27/03/2020, à 19:26

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Je suis pas là pour me faire mal parler ou comme si j'étais en petites classes.  La question ne se limite pas à un NR puisque le NR ne va me sortir que les lignes à partir duquel je lui rentre et pas le reste haut du fichier.

Si t'as une solution c'est cool, sinon si quelqu'un d'autre à une solution merci beaucoup je suis preneur smile

Dernière modification par judkil (Le 27/03/2020, à 19:30)

Hors ligne

#23 Le 27/03/2020, à 19:36

pingouinux

Re : AWK déplacer les lignes d'un fichier vers le bas

awk 'NR>=3 && NR<=5 {print}' input >output

Hors ligne

#24 Le 27/03/2020, à 19:39

judkil

Re : AWK déplacer les lignes d'un fichier vers le bas

Ce code ne va pas marcher puisqu'en output il ne va plus m'afficher les lignes 1 et 2.

Dernière modification par judkil (Le 27/03/2020, à 19:40)

Hors ligne

#25 Le 27/03/2020, à 19:42

Watael

Re : AWK déplacer les lignes d'un fichier vers le bas

NR ne va me sortir que les lignes à partir duquel je lui rentre et pas le reste haut du fichier

ta phrase est approximative, mais non.
si tu ne fais qu'un seul test, tu n'auras qu'une réponse. OR, tu as besoin de deux réponses, donc... ?
allez petit, encore un effort !


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne