étendre le script awk pour plusieurs lignes dans les deux fichiers texte et non si les deux fichiers n'ont qu'un seul enregistrement

Dec 01 2020

JE PEUX générer cette sortie 3 .txt

AA;BB;CC;DD;

à partir de 2 fichiers texte. Les deux fichiers n'ont qu'un seul enregistrement

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

J'utilise ce script awk.

BEGIN{
  FS=OFS=";"
}
{
  for(i=1;i<=NF;i++){
    if(!seen[$i]++){ val=(val?val OFS:"")$i }
  }
  print val
  delete seen
  val=""
}

J'utilise de cette manière, j'utilise la pastecommande pour combiner les deux fichiers et ensuite traiter sa sortie par awkcommande.

paste 1st.txt 2nd.txt | awk -f tst.awk > "3.txt"

Mais qu'est-ce que je veux?
Je dois considérer plus d'un seul enregistrement. J'essaye d'adapter ce script à cette situation. Vous pouvez voir que maintenant, les deux fichiers n'ont pas qu'un seul enregistrement.

1 .txt

UU;    
AA;BB;
ZZ;KK;

2 .txt

CC;DD;BB;AA;
LL;KK;
GH;ZZ;SS;

la sortie 3 .txt que j'essaie de générer est la suivante

UU;
AA;BB;CC;DD;
ZZ;KK;LL;GH;SS;

logique de traitement:

Le code ci-dessus utilise simplement des chaînes littérales dans une recherche de hachage d'index de tableau, donc il ne se soucie pas des caractères que vous avez dans votre entrée.
Cependant à propos de la sortie d'échantillon: si dans 2 .txt il y a des champs communs également dans 1 .txt.Par exemple, BB;AA;vous devez les concaténer sur une seule ligne, c'est-à-dire AA;BB;CC;DD; L'ordre n'est pas requis, par exemple n'est pas pertinent si la sortie est BB;AA;DD;CC;Seule condition requise est d'éviter les champs en double dans la même ligne

Quand je dis `` éviter les doublons '', je veux dire éviter cette sortie

AA;BB;CC;DD;BB;AA;

car la sortie doit être

AA;BB;CC;DD;

Réponses

4 User Dec 01 2020 at 15:23

Peut-être que c'est ce que vous voulez:

BEGIN{FS=OFS=";"}
{sub(/;$/,"")} NR==FNR{ for (i=1;i<=NF;++i) for (j=1;j<=NF;++j) if (j!=i&&!b[$i,$j]++) a[$i,++c[$i]]=$j
    next
}
{
    delete b
    for (i=1;i<=NF;++i)
        ++b[$i] for (i=1;i<=NF;++i) for (j=1;j<=c[$i];++j)
            if (!b[a[$i,j]]++) $(NF+1)=a[$i,j]
    print
}

Utilisez-le comme ceci:

awk -f script.awk 2.txt 1.txt

Voici quelques questions précédentes (vraisemblablement les vôtres - vous voudrez peut-être les examiner et travailler sur la manière de poser correctement votre question):

  • https://superuser.com/q/1600078
  • awk: conserver l'ordre des lignes et supprimer les chaînes en double (miroirs) lors de la génération de données
  • https://superuser.com/q/1600557
  • https://superuser.com/q/1601402
  • https://superuser.com/q/1602713
  • https://stackoverflow.com/q/64929865
  • https://superuser.com/q/1604046
  • Expressions régulières dynamiques dans awk
  • Troncature des chaînes après l'exécution du script awk