2017-03-11 1 views
1

J'ai un fichier txt avec deux colonnes qui dans chaque colonne j'ai des ID de fonction qui indiquent la première fonction appelle la deuxième fonction comme ci-dessous:Utilisation du langage awk pour construire un graphique d'appel de fonction à partir d'un fichier txt contenant des ID de fonction

1,4

12,5

4,8

8,1

5,23

Maintenant, je vais utiliser les commandes awk pour trouver un flux de mes appels de fonction. Par exemple, sur la base du contenu ci-dessus de mon fichier, je veux extraire un flux de 1,4,8 et 12,5,23

Pour chaque flux, je vais continuer à ajouter les ID de fonction jusqu'à ce que j'atteigne un cercle ou j'arrive à la fin du fichier. Mes fichiers sont très gros et je ne veux pas utiliser python.

+0

S'il vous plaît partager votre fichier d'entrée et de sortie prévu ainsi que des critères pour extraire la sortie. –

+0

@EdMorton - "jusqu'à ce que j'atteigne un cercle" n'est pas clair pour moi. –

+0

@Ed Morton, Mon fichier n'a que deux colonnes et je veux lire les lignes de haut en bas. Pour chaque ligne, je ne regarderai pas les lignes avant. Dans votre exemple, 5,23 12,5 7,5 je vais avoir F1: 5,23 et F2: 12,5 et F3: 7,5 juste ces trois flux (F). Mais dans mon exemple mentionné dans le contenu de la question, je vais avoir F1: 1,4,8 F2: 12,5,23 juste cela. Est-ce clair pour vous? – Stateless

Répondre

1

Vous aurez besoin d'un programme descente récursive, comme ceci:

$ cat recurse.awk 
BEGIN { FS=OFS="," } 
{ 
    roots[NR] = $1 
    map[$1] = $2 
} 
END { 
    for (rootNr=1; rootNr<=NR; rootNr++) { 
     root = roots[rootNr] 
     if (!(seen[root]++)) { 
      tree = root 
      descend(root) 
      print tree 
     } 
    } 
} 

function descend(root, branch) { 
    if (root in map) { 
     branch = map[root] 
     if (!(seen[branch]++)) { 
      tree = tree OFS branch 
      descend(branch) 
     } 
    } 
} 

$ awk -f recurse.awk file 
1,4,8 
12,5,23 
+1

Cela fonctionne pour moi! – Stateless