1
votes

Archiver la ligne de commande si un mot est manquant lorsqu'un mot existe dans plusieurs fichiers

Comment puis-je avoir une liste qui me dit quand un mot (SecondWord dans mon exemple) est manquant quand un autre mot (FirstWord dans mon exemple) a été écrit.

File1.txt:

Bonjour FirstWord ... SecondWord

...

... FirstWord ...

FirstWord ... SecondWord

FirstWord ... ...

Bonjour ... SecondWord

File2.txt:

Bonjour FirstWord ... SecondWord

FirstWord ...

Je voudrais un fichier à la fin avec la ligne et le nom du fichier:

3: Fichier1

5: Fichier1

2: Fichier2

Je pense que ce que j'essaie de faire est exagéré: /

   filename='test.txt'
lineArray[0]=0
filesAwaitable[0]=$lineArray
grep -r -n 'FirstWord ' Sources/ --include=\*.txt | awk -F: '{print $2":"$1}' > $filename
while read line; 
    do 
        IFS=:
        ary=($line)
        for key in "${!ary[@]}";
            do
                if [[ $filesAwaitable["$key"] != *"${ary[$key]}"* ]]; then
                    filesAwaitable["$key"] = "${ary[$key]}"
                    echo "${ary[$key]}";
                fi
                
                #grep -n -r 'SecondWord' line | awk -F: '{print $2":"$1}'
                
            done
    done < $filename

Merci pour votre aide


3 commentaires

Quelle ligne dans votre exemple File1.txt est la ligne 5? Quel mot est le mot manquant et quel mot est un autre mot ?


Bonjour, je modifie ma question pour mieux mettre en retrait. Dans mon exemple, je veux savoir quand SecondWord est manquant alors que FirstWord a été écrit auparavant.


Thx, vous avez raison. Fait


3 Réponses :


0
votes

Dans mon exemple, je veux savoir quand SecondWord est manquant alors que FirstWord a été écrit auparavant.

Si vous avez un grep qui comprend les expressions régulières perl, vous pouvez directement spécifier un modèle pour FirstWord non suivi de SecondWord n'importe où jusqu'à la fin de la ligne : p >

awk -F: '{print $2,":",$1}'

Cela donne pour les exemples donnés:

File1.txt:3:... FirstWord ...
File1.txt:5:FirstWord ... ...
File2.txt:2:FirstWord ...

Pour réorganiser cela au format de sortie souhaité, vous pouvez le diriger vers p>

grep -nP 'FirstWord((?!SecondWord).)*$' File?.txt

2 commentaires

Thx Armali, qu'est-ce que -P? semble parfait pour le faire en une seule ligne. Mais ça ne marche pas


@ B.Brigitte - -P , --perl-regexp ˿ Interpréter PATTERN comme une expression régulière Perl. Cette option est disponible dans GNU grep ; peut-être pouvez-vous l'installer, ou je penserai à une approche sans elle (mais ce serait beaucoup plus compliqué, similaire à la vôtre - ou seriez-vous d'accord pour utiliser perl ?).



0
votes

Dans le cas où une solution Perl est correcte, en voici une simple avec la même expression régulière que pour GNU grep:

find Source -name \*.txt|xargs perl …

Comment puis-je utiliser cette commande dans tous les dossiers Source / pour tous les fichiers .txt?

Vous pouvez utiliser find pour cela:

perl -ne 'print "$. : $ARGV\n" if /FirstWord((?!SecondWord).)*$/; close ARGV if eof' File?.txt

(sans le File? .txt à la fin de la perlcommand).


8 commentaires

Cela semble parfait, merci. J'ai du remplacer par -nle coz grep -P ne fonctionne plus. Comment puis-je utiliser cette commande dans tous les dossiers Source / pour tous les fichiers .txt?


@ B.Brigitte - Le remplacement du Fichier? .Txt par sous-dossier / *. Txt devrait être suffisant pour le faire apparaître dans tous les fichiers txt du sous-dossier .


qu'en est-il du sous-dossier sur le sous-dossier que je ne connais pas?


sous-dossier / *. txt s'il n'y a pas de fichier txt dans ce sous-dossier. ça crée une erreur


@ B.Brigitte - J'ai développé la réponse.


Merci beaucoup. N'aurait pas pu se passer de toi. Thx pour votre patient


Est-il possible avec find d'exclure des fichiers spécifiques?


@ B.Brigitte - Pour exclure e. g. le fichier test.txt , on peut le faire avec: find Source -name \ *. txt! -nom test.txt… .



0
votes

Si le shell est bash , le problème peut être résolu facilement avec le opérateur de correspondance de modèle étendu ! ( modèle ) , qui correspond à tout sauf au modèle em donné >:

shopt -s extglob    # enable extended pattern matching features
for file in "$@"
do  lineno=0
    while read line
    do  ((++lineno))
        case "$line" in *FirstWord!(*SecondWord))   echo $lineno : $file
        esac
    done <$file
done


0 commentaires