2016-06-20 2 views
-1

Quand je fais produit croisé des enregistrements dans fichier.txt> file2.txt en utilisant la commande:Retirez les enregistrements avec les mêmes valeurs de produit croisé dans AWK

join file1.txt{,} -j999 > file2.txt

Je reçois chaque enregistrement file1.txt avec tous les enregistrements file1.txt tels que:

ensemble de données

exemple

r1 
r2 
r3 

Je reçois

r1 r1 
r1 r2 
r1 r3 
r2 r1 
r2 r2 
r2 r3 
r3 r1 
r3 r2 
r3 r3 

Je ne veux pas r1 r1, r2 r2, dossiers et ainsi de suite ...

Si son droit possible tout en faisant multiproduits, comment puis-je obtenir les résultats escomptés? sinon, Comment puis-je supprimer les enregistrements après traitement joindre file1.txt {,} -j 999

J'ai essayé avec une autre commande awk:

if($i!=$(i+12)){print $0;} and 

if($1!=$13){print $0;} 

Parce que je le numéro de série de chaque fiche 1, 2,3, ... J'ai fILE2.TXT comme:

c1 c13 --> column 1 and column 13 
1 1 
1 2 
1 3 
1 4 
2 1 
2 2 
2 3 
2 4 
3 1 
3 2 
3 3 
3 4 

Je compare simplement les numéros de série et si elles ne sont pas égaux imprimer ces documents. mais j'obtenir des résultats indésirables, tels que:

1 2 
1 3 
1 4 
2 3 
2 4 
3 4 

Vous pouvez le voir saute tous les enregistrements avant 1 $ = 13 $!. donc il y a des lignes manquantes comme:

2 1 
3 1 
3 2 

il ne doit ignorer les enregistrements qui sont dans le modèle r1 r1, r2 r2, ...

Mise à jour

image

1er et 13 col est un numéro de série.

+0

S'il vous plaît mettre à jour montrant une [mcve] - et avec le texte, pas une image. Sinon, il est difficile de travailler sur la solution. – fedorqui

Répondre

1

boucle seulement deux fois dans le fichier:

awk 'FNR==NR {a[FNR]=$0; next} 
    BEGINFILE{lines=NR-FNR} 
    { 
     for (i=1;i<=lines;i++) { 
      if (i!=FNR) print $0, a[i] 
     } 
    }' file file 

Cette stocke les données dans un tableau a[line_number]=value_on_that_line lors de la lecture de la première fois. Ensuite, en lisant pour la deuxième fois, il parcourt simplement le nombre de lignes imprimant toutes les paires, sauf lorsque le numéro de ligne correspond à l'index, c'est-à-dire lorsqu'il est mappé sur la même ligne.

Pour votre fichier donné avec r1, r2, r3 il retourne:

$ awk 'FNR==NR {a[FNR]=$0; next} BEGINFILE{lines=NR-FNR} {for (i=1;i<=lines;i++) { if (i!=FNR) print $0, a[i]}}' f f 
r1 r2 
r1 r3 
r2 r1 
r2 r3 
r3 r1 
r3 r2 
+0

J'essaie, mais j'ai 4 000 000 d'enregistrements. et j'ai 26 cols au total où r1 et r2 ont chacun 16 cols Et cela prend beaucoup de temps. Existe-t-il un moyen efficace de supprimer celui que vous avez fourni? comme juste comparer $ i == $ (i + 12). si c'est le cas, dans chaque enregistrement si un enregistrement contient les 13 premiers champs correspondant aux 13 champs suivants. enlever la ligne? ou n'imprime rien alors c'est supprimé? –

+0

@MurlidharFichadia: Les numéros de colonne sont-ils corrigés pour les deux? comme le col 1 et 10? – Inian

+0

@Inian s'il vous plaît vérifier l'image –