2012-03-02 3 views
0

J'essaie de comparer deux textes sous Unix. J'ai essayé le ci-dessous. Ça n'a pas marché. Besoin de comparer les première et dernière lignes d'un fichier.Comparer le texte sous Unix

firstline=`head -1 test.txt` 
echo $firstline 
lastline=`tail -1 test.txt` 
echo $lastline 
if [ $firstline == $lastline ] 
then 
    echo "Found" 
fi 

Sûrement, je manque quelque chose. S'il vous plaît aider.

+0

"Ça n'a pas marché" est trop vague. Qu'est-ce qu'il a fait ou non? –

+0

Quelle coque utilisez-vous? –

Répondre

1

Peut-être plus simple ...

bash-3.2$ if [ "$(sed -n '1p' file)" = "$(sed -n '$p' file)" ]; then 
    echo 'First and last lines are the same' 
else 
    echo 'First and last lines differ' 
fi 

mise à jour pour répondre aux questions de Jan.

bash-3.2$ cat file 
-z 
-G 
bash-3.2$ if [ "$(sed -n '1p' file)" = "$(sed -n '$p' file)" ]; then 
>  echo 'First and last lines are the same' 
> else 
>  echo 'First and last lines differ' 
> fi 
First and last lines differ 

Je préfère sed pour saisir les premières et dernières lignes d'un fichier parce que le même fonctionne en ligne de commande sous Linux, Mac OS et Solaris. Les lignes de commande head et tail sont différentes entre Linux et Solaris.

+0

Et si la première ligne est, disons, '-z'? –

+0

Pourquoi utilisez-vous 'sed' au lieu de' head' et 'tail' comme dans la question? Il me semble que c'est moins lisible et je ne vois aucun avantage. –

+0

@JanHudec: Bonnes questions. J'espère que ma mise à jour les couvre pour vous. – Johnsyweb

0

devrait être if [ "$firstline" = "$lastline" ]

Si vous omettez les guillemets doubles, il ne fonctionnera pas si la ligne (s) contiennent des caractères blancs.

+0

Non, '-eq' est pour comparer des entiers, et vous obtiendrez quelque chose comme" ...: expression entière attendue "comme une erreur si vous essayez. –

+0

Oui, vous avez raison, juste réparé. – sirgeorge

+0

Que faire si la première ligne est, disons, «-z»? –

1

En supposant que vous utilisez "une sorte" de bourne shell, vous devez (a) citer les variables et (b) doivent utiliser un seul =:

if [ "$firstline" = "$lastline" ] 
then 
    echo "Found" 
fi 

Mise à jour En réponse à certains commentaires , cela fonctionnera également si $firstline est -z. Même dans ce cas, l'instruction if est et non interprétée comme if [ -z ... ], au moins dans le ksh (Korn Shell) ou dans Bash (je n'ai pas de système avec un shell simple bourde sh disponible).

+1

Pourquoi la downvote? –

+0

Que faire si la première ligne est, disons, «-z»? (Je n'étais pas le downvoting, cependant). –

+0

@Jan Hudec: Merci d'essayer de clarifier, mais cela ne fait pas de mal (au moins, il n'est pas interprété comme '[-z ...]'). –

0

À tout le moins, vous devez citer les extensions de variables. De plus, vous devez ajouter un préfixe pour éviter les problèmes si les chaînes commencent par -. Et l'opérateur correct est =. Donc ça devrait être

if [ "x$firstline" = "x$lastline" ] 
+1

Je suis vraiment curieux. Je n'ai pas été capable de reproduire le "-z Issue" avec ksh ou bash (voir la mise à jour de ma réponse). Cela n'arrive-t-il qu'avec de vieux sh? (Comme l'OP n'a pas dit quelle coquille exactement). –