Besoin d'aide sur AWK

Résolu
Bonjour, je dois faire un programme en AWK et j'ai quelques questions.

Peut on faire plusieurs FS?
Comment créer un dossier avec une valeur du texte
( exemple : dossier originel 1 2 3 4
dossier final j'ai mangé 4 pommes ( avec 4 car $4 ) )?
Comment avoir le nombre de lignes du dossier dans BEGIN?

Merci beaucoup pour vos réponses,
Si besoin de précisions sur les conditions, demandez

43 réponses

Résumé de la discussion

Plusieurs questions portent sur AWK, notamment comment définir plusieurs séparateurs de champs, créer des dossiers ou fichiers à partir de valeurs extraites du texte et obtenir le nombre de lignes en BEGIN. Plusieurs réponses décrivent des approches pratiques: rediriger la sortie vers des fichiers ou dossiers avec des chemins issus de colonnes, maintenir des variables hors de la boucle et gérer des sorties liées aux données. D'autres échanges soulignent des difficultés comme l'usage de contenu aléatoire dans A, B, C, D, l'ouverture de dossiers mentionnés dans des scripts et les méthodes pour compter les lignes avec getline ou NR.

Bobot (l’IA à votre service)
  1. deplus mon action fait un resultat comme ca :
    A
    B
    C
    alors que je le voulais sous la forme A B C
    ( c'est NR == 6 { print $2 } NR == 7 { print $2 } NR == 8 { print $2 }

    [ RESOLU ]
    NR == 6, NR == 8 { printf $2" " }

    ( NR == 6, NR == 8 : pour la ligne de 6 a 8 ; printf $2" " : printf print sans mettre d'espace apres ou de saut a la ligne, du coup je printf + un espace, donc pas de saut a la ligne mais un espace )

    je vais mettre la balise RESOLU et je vais refaire un topic pour une question bien précise
    lien : https://forums.commentcamarche.net/forum/linux-unix-13/new#p28202984
    1. ok, je pense que c'est parce que ce sont des données de localisation et qu'un fichier a les vitesse, car quand je demande de print le fichier, j'ai plus le ptit truc, j'ai 10 000 pages sur le shell....
      1. tres bien, je n'ai plus que : illegal reference to variable action
        j'use cette variable dans awk
        1. Contributeur
          si PARAM_VAR est une variable:
          action=$(awk ' BEGIN{"mes FS"} {print$2} ' <<<"$PARAM_VAR") 
          1. j'ai le message suivant : cannot open PARAM_VAR,
            illegal reference to variable action
            1. Contributeur
              il faut utiliser un tableau
              $ var[0]=3615; var[1]="hahaha" ; var[2]=3.14 ; var[3]="xxx"
              $ i=2 ; echo ${var[$i]}
              3.14
              $ echo ${#var[@]} # taille du tableau
              4
              $ echo ${var[@]}  # contenu du tableau
              3615 hahaha 3.14 xxx
              
              1. non, prendre ces données, et les mettre dans le fichier fait par les contenance a ligne de leur chemin ^^

                en gros j'avais comme idée :
                faire une boucle de variable, qui pour chaque ligne du fichier d'origine contenant les lien ( fichier 2 )
                la ligne 1 serait egale a var1 ... etc
                et apres je fait une variable de procedure awk qui va retirer les valeurs voulues dans une variable var11 disons, puis var22 ... et enfin concatener avec une boucle ( car je ne sais pas combien il y en a )

                je vais le faire comme ca
                action=$(awk ' BEGIN{"mes FS"} {print$2} ' PARAM_VAR) j'ai trouvé ca dans internet, mais comment l'utiliser?
                en faisant action$1 par exemple? sinon, que mettre a la place de PARAM_VAR?
                1. Contributeur
                  remplacer X Y Z dans ces balises?
                  <Blu>X</Blu>
                  <bly>Y</bly>
                  <ble>Z</ble>
                  1. en fait j'ai plus besoin du while get line, j'ai fait un dossier comprennant le nombre de ligne uniquement, j'ai fait un dossier grace a cette information, et je concatene avec les informations contenues dans des lignes

                    alors, en gros A = .//blabla/blabla/E.xml
                    dans .//blabla/blabla/E.xml j'ai par exemple :
                    <bla>
                    <bli>
                    <blo>
                    <Blu>X</Blu>
                    <bly>Y</bly>
                    <ble>Z</ble>
                    </blo>
                    </bli>
                    </bla>

                    et je veux que dans mon dossier au lieu de A j'ai X Y Z
                    1. Contributeur
                      j'ai pas compris : recuperrer des données ........... A,B,C,D et les remplacer par A,B,C,D,

                      dossier veut dire fichier ou répertoire ?

                      le while(getline) est pourtant correct:
                      $ seq 1 10 > a3
                      $ wc -l a3
                      10 a3
                      $ awk 'BEGIN{while(getline); print NR}' a3
                      10
                      $
                      que répond wc -l fichier ?
                      1. C'est parfait, merci,( pour le mettre dans un dossier faire > dossier )

                        Bon, deja je sais faire ca, merci beaucoup, maintenant, sais tu comment je pourrais faire :

                        recuperrer des données contenue dans un dossier dont le parcours est le terme A,B,C,D et les remplacer par A,B,C,D, je sais ou elle se trouve dans les dossier ( toujours au memes endroit ) , si t'as besoin de l'endroit, je suis a ta disposition, en tout cas merci, dommage que ce soit des coms sinon je t'aurais mis des +1 ;)

                        deplus je veux faire
                        il y a " temps de ligne " en begin, du coup j'ai fait
                        BEGIN {
                        {print" il y a"} {while(getline); print NR}
                        }
                        ca marche mais mon chiffre est a la ligne du dessous
                        et ca empeche les actions de ligne de se faire...
                        1. Contributeur
                          $ echo "$aa"
                          1
                          2
                          3
                          4
                          $ echo "$ab"
                          a
                          b
                          c
                          d
                          $ echo "$ac"
                          A
                          B
                          C
                          D
                          $ paste -d ' ' <(echo "$aa") <(echo "$ab") <(echo "$ac")
                          1 a A
                          2 b B
                          3 c C
                          4 d D
                          $ 
                          
                          1. moi je te suis ^^

                            Mais avoir un fichier comme demandé, ca serait le mieux ( plus facile pour la suite )
                            j'ai 5 variable ( en colonne ) et je voudrais les concaténer pour en faire 5 colonnes
                            1. Contributeur
                              écrire ces 5 variables dans un fichier en 5 colonnes?
                              plutot que des variables multiples, on peut utiliser un tableau
                              1. Donc en gros j'ai reussi a faire 5 variables ( une pour chaque colonne ) , j'aimerai faire un dossier qui contient ces 5 variables ( donc sur 5 colonnes )
                                1. en fait c'est l'ensemble des lignes du fichier ( les lignes vides comprises )

                                  je me suis fait recaler ^^ permission denied
                                  sinon quand je fais
                                  variable=$(awk '.........' fichier ) , le fichier etant un fichier du type "fichier 3", il me dit,
                                  .//blibli/blibli/EF.xml. No such file or directory

                                  En gros mon truc marche mais pas quand c'est des liens de fichiers j'ai l'impression

                                  Miracle, ca marche je ne sais comment, sans rien avoir toucher, je confirme que variable=$(awk ' { print $0 } fichier ) marche
                                  1. Contributeur
                                    un print de quel ensemble ?
                                    un fichier dans une variable en bash:
                                    var=$(<fichier); echo "$var"
                                    1. Sinon, comment faire un print de l'ensemble en gardant les lignes vides?
                                      Et associer une variable a tout ce que contient un fichier? pas forcement en awk.

                                      Désolé pour toutes ces questions mais j'ai rien trouvé sur internet de concret/ expliqué, du coup j'espere faire un topic claire pour ceux qui nous lirons

                                      Pour ceux qui se demande comment faire pour la variable :
                                      variable=$(awk '.........' fichier )
                                      Ca donne a la variable ce qu'affiche awk, donc faut du print, pas d'espace avant et apres le =
                                      1. Salut dubcek,

                                        il ne me semble pas qu'ils soient originaire de windows

                                        EDIT : petit soucis, mes variables n'ont pas de valeurs hors de la boucle awk... je pense que ca marchait avant en gros si j'ai un print dans awk' ', ca marche, sinon j'ai rien
                                        1. Contributeur
                                          si des fichiers viennent de Windows, attention aux ^M en fin de lignes
                                          • 1
                                          • 2
                                          • 3