L'entrée est un ou plusieurs fichiers contenant la liste des noms de fichiers avec leurs chemins, séparés par '/' (à partir de la sortie ls / dir réorganisée)

   file1 / path1
   file2 / path2
   file3 / path3
   file4 / path4
   file3 / path5
   ...

La sortie souhaitée est similaire sauf pour les doublons pour lesquels je voudrais leurs nombres individuels et les chemins associés (soit sur la même ligne, séparés par '/' ou en retrait après chaque nom de fichier en double):

1 / file1 / path1
1 / file2 / path2
2 / file3 / path3-1 / path3-2
1 / file4 / path4
...

Ou

1 / file1 / path1
1 / file2 / path2
2 / file3 / path3-1
            path3-2
1 / file4 / path4
...

Pour l'instant, j'ai un gros gâchis, au moins ça fait quelque chose mais j'espère que c'est une façon plus concise, légère et peut-être plus rapide de le faire! puisque je n'ai pas trouvé comment éviter de stocker toutes les lignes dans tmp var ...

gawk -F/ -v "tot=c" "{a[$1]++;l[$1]=$1;m[$1]=$2;if (a[$1]>1) m[$1]=m[$1]FS$2;} END {for (i in a) {print a[i],FS,l[i],FS,m[i]; c+=a[i]};print c}" file1 file2 > out
              ^                                                    ^ here, it doesn't keep      ^
              ^                                                      prev path and add new      ^
              ^                                                                                 ^[*]                                                                              

Ainsi, le problème est de conserver les chemins précédents des doublons et de ne les afficher qu'à chaque dernière occurrence.

: [*]: en plus: le var c ajouté est censé compter le nombre total de doublons, ce qu'il fait si j'ajoute 'if (a [i]> 1)' à la position de l'astérisque '(il (est alors sorti comme la dernière ligne), mais n'imprimant que des copies ... Donc, mieux que d'exécuter cette commande deux fois, peut-être que quelqu'un viendra avec une solution en une fois :)

Nb:
il n'y a pas / dans les chemins, ce sont des chemins Windows (ni dans les noms de fichiers!)
mais le chemin et les noms de fichiers peuvent contenir n'importe quel caractère fantaisie autorisé (en particulier les raccourcis de page Web)
en utilisant les binaires Gnuwin dans MSdos batch, remplacez donc "par '& v / v si nécessaire

Je vous remercie

0
foxtrott 20 août 2020 à 20:52

2 réponses

Meilleure réponse
$ awk -F/ -v OFS=' / ' '{c[$1]++; v[$1]=($1 in v?v[$1] OFS:"")$2} 
                    END {for(k in c) print c[k],k,v[k]}' file

1 /  file1  /  path1
1 /  file2  /  path2
2 /  file3  /  path3 /  path5
1 /  file4  /  path4

Cependant, cela ne fonctionnera pas si vous avez / dans vos valeurs de chemin ...

1
karakfa 20 août 2020 à 18:34

Donné input.txt contenant:

   file1 / path1
   file2 / path2
   file3 / path3
   file4 / path4
   file3 / path5

Et pgm.awk contenant:

BEGIN{
  FS="/"
}
{
  a[$1] = a[$1] "/" $2
}
END{
  for(i in a){
    n=split(a[i], b)
    if(n == 2){
      print n-1 "/" i  a[i]
    } else {
      p=n-1 "/" i
      for(j=2; j<=n; j++){
        p=p "/" b[j] "-" j-1
      } 
      print p
    }
  }
}

Fonctionnement:

gawk -f pgm.awk input.txt

Les sorties:

1/   file1 / path1
1/   file2 / path2
2/   file3 / path3-1/ path5-2
1/   file4 / path4
0
rossifr 21 août 2020 à 04:51