#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 , Est ce que quelqu'un aurait une idée ??
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
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