3 votes

Comparaison des résultats de deux greps

J'ai deux fichiers source C avec beaucoup de définitions et je veux les comparer l'un à l'autre et filtrer les lignes qui ne correspondent pas. La fonction grep ( grep NO_BCM_ include/soc/mcm/allenum.h | grep -v 56440 ) la sortie du premier fichier peut ressembler à ceci :

...
...
# if !defined(NO_BCM_5675_A0)
# if !defined(NO_BCM_88660_A0)
# if !defined(NO_BCM_2801PM_A0)
...
...

où grep ( grep "define NO_BCM" include/sdk_custom_config.h ) de la seconde ressemble :

...
...
#define NO_BCM_56260_B0
#define NO_BCM_5675_A0
#define NO_BCM_56160_A0
...
...

Donc maintenant, je veux trouver tous les numéros de type dans les accolades ci-dessus qui manquent dans le fichier #define en dessous. Comment dois-je m'y prendre ? Je vous remercie.

4voto

codeforester Points 17582

Utilisez comm de cette façon :

comm -23 <(grep NO_BCM_ include/soc/mcm/allenum.h | cut -f2 -d'(' | cut -f1 -d')' | sort) <(grep "define NO_BCM" include/sdk_custom_config.h | cut -f2 -d' ' | sort)

Cela donnerait des jetons uniques à include/soc/mcm/allenum.h .

Sortie :

NO_BCM_2801PM_A0
NO_BCM_88660_A0

Si vous voulez les lignes complètes de ce fichier, alors vous pouvez utiliser fgrep :

fgrep -f <(comm -23 <(grep NO_BCM_ include/soc/mcm/allenum.h | cut -f2 -d'(' | cut -f1 -d')' | sort) <(grep "define NO_BCM" include/sdk_custom_config.h | cut -f2 -d' ' | sort)) include/soc/mcm/allenum.h

Sortie :

# if !defined(NO_BCM_88660_A0)
# if !defined(NO_BCM_2801PM_A0)

À propos de comm :

NOM comm - comparer deux fichiers triés ligne par ligne

SYNOPSIS comm [OPTION]... FICHIER1 FICHIER2

DESCRIPTION Compare les fichiers triés FILE1 et FILE2 ligne par ligne.

   With no options, produce three-column output.  Column one contains lines unique to FILE1, column two contains lines unique to

FICHIER2, et la troisième colonne contient les lignes communes aux deux fichiers.

   -1     suppress column 1 (lines unique to FILE1)
   -2     suppress column 2 (lines unique to FILE2)
   -3     suppress column 3 (lines that appear in both files)

4voto

Inian Points 36223

Vous pourriez utiliser un awk logique avec deux gestionnaires de substitution de processus pour grep

awk 'FNR==NR{seen[$2]; next}!($2 in seen)' FS=" " <(grep "define NO_BCM" include/sdk_custom_config.h) FS="[()]" <(grep NO_BCM_ include/soc/mcm/allenum.h | grep -v 56440)
# if !defined(NO_BCM_88660_A0)
# if !defined(NO_BCM_2801PM_A0)

L'idée est que les commandes dans <() s'exécutera et produira les résultats nécessaires. L'utilisation de FS avant les sorties pour s'assurer que l'entité commune est analysée avec un délimiteur approprié.

FS="[()]" est de capturer $2 comme le champ unique dans le second groupe et FS=" " pour la limitation par défaut des espaces blancs dans le premier groupe.

La logique fondamentale de awk est l'identification d'éléments non répétitifs, c'est à dire FNR==NR analyse le premier groupe en stockant les entrées uniques dans $2 comme une carte de hachage. Une fois que toutes les lignes sont analysées, !($2 in seen) est exécuté sur le second groupe, ce qui signifie qu'il faut filtrer les lignes dont les $2 du second groupe n'est pas présent dans le hachage créé.

3voto

Ed Morton Points 25374

Il est difficile de se prononcer sans le contexte environnant à partir de vos exemples de fichiers d'entrée et sans les résultats attendus, mais il semble que c'est tout ce dont vous avez besoin :

awk '!/define.*NO_BCM_/{next} NR==FNR{defined[$2];next} !($2 in defined)' include/sdk_custom_config.h FS='[()]' include/soc/mcm/allenum.h

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X