Tentando fazer loop entre linhas de dois arquivos

1. Tentando fazer loop entre linhas de dois arquivos

Carlos
krlsdu

(usa Ubuntu)

Enviado em 08/06/2011 - 18:59h

Pessoal estou tendo dificuldade para entender o erro no script que eu criei para fazer um loop entre as linhas de dois arquivos
estou usando o seguinte script pesso ajuda para resolver:

#!/bin/bash

while read linha1
do
while read linha2
do

if [ "$linha2" = "$linha1" ]; then

echo "$linha2 = $linha1"
echo "iguais";

fi


if [ "$linha2" != "$linha1" ]; then

echo "$linha2 = $linha1"
echo "diferente";

fi

done < arquivo1


done < arquivo2

Toda vez que executo ele só cai na segunda condição mesmo que existam linhas iguais eu não entendo porque eu ja tentei várias formas mas nenhuma resolveu.
obrigado!



  


2. Re: Tentando fazer loop entre linhas de dois arquivos

Perfil removido
removido

(usa Nenhuma)

Enviado em 08/06/2011 - 21:15h

#!/bin/bash

while read linha1; do
while read linha2; do

if [ "$linha2" = "$linha1" ]; then
echo "$linha2 = $linha1"
echo "iguais";
fi


if [ "$linha2" != "$linha1" ]; then
echo "$linha2 = $linha1"
echo "diferente";
fi

done < arquivo1
done < arquivo2

========================

no final do script o 1º done fecha o 2º loop, os arquivos estão certos??

faz um debug e analiza o resultado

# bash -xv script.sh

a forma que vc está comparando no 1º if está errado, não é "=" e sim "==" ou "-eq"

ou seja

if [ "$linha2" == "$linha1" ]; then


3. Eu faria 2fors e não 2whiles

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/06/2011 - 02:35h

Acho que deverias fazer dois laços de repetição com fim e inicio determinados, vulgo "for" e não dois laços de repetição com inicio condicional e fim inderteminado/condicional também amplamente conhecidos como "while", porque você "conhece" as linhas dos arquivos envolvidos, certo...

Caso use linhas com varias palavras em seus arquivos de entrada seria interessante configurar a variável de ambiente IFS - "Internal Field Separator" - de forma adequada: ela deve estar configurada para que somente novas linhas sejam usadas para separar os campos dentro dos loops e não o default [tabulação, espaço, nova linha].

E finalmente o teste comparativo deve permanecer como o amigo acima brilhantemente indicou por se tratar de envolver duas strings.


#!/bin/bash
# - Testa/compara as linhas de dois arquivos de texto.
#
# author: ./.ronin
# date: 2011-06-09 23:58 (GMT -03:00)
# more: http://sekysu.blogspot.com
#

IFS_O=$IFS
IFS=$'\n'
ARQ=('arquivo1.txt' 'arquivo2.txt')
for i in $( cat ${ARQ[0]} )
do
for j in $( cat ${ARQ[1]} )
do
echo -en "As linhas \n \"$i\" \n e \n \"$j\" \n sao "
if [ $i == $j ]
then
echo 'iguais.'
else
echo 'diferentes.'
fi
echo ' '
done
done
IFS=$IFS_O

exit

Espero ter ajudado e não ter sido muito chato... 8P Fui...


4. Re: Tentando fazer loop entre linhas de dois arquivos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 09/06/2011 - 13:09h

Fiz um script a um tempo atras para um colega de vol .... talvez possa te ajudar.


#!/bin/bash
# xdiff
# --------------------------------------
# Script Viva o Linux
# --------------------------------------
# fdmarp

help ()
{
clear
echo "
User Commands xdiff(1)

`tput bold`NAME`tput sgr0`
xdiff - compara colunas de arquivo

`tput bold`SYNOPSIS`tput sgr0`
xdiff [arquivo_1][arquivo_2] [numero_da_coluna1] [numero_da_coluna2]


`tput bold`DESCRIPTION`tput sgr0`
Compara determinada coluna de um arquivo com uma coluna de outro
arquivo.
Caso nao seja definida a coluna do segundo arquivo, sera assumida a
mesma do arquivo_1.

`tput bold`OPTIONS`tput sgr0`
The following options are supported:

arquivo_1 - nome do primeiro arquivo.

arquivo_2 - nome do segundo arquivo.

coluna_1 - numero da coluna no arquivo_1.

coluna_2 - OPICIONAL - numero da coluna no arquivo_2.


Examples:
xdiff Arq1.txt Arq2.txt 1 2
xdiff Arq1.txt Arq2.txt 2

`tput bold`VERSION`tput sgr0`
Version is 1.01

"
exit 0

}

COLUNA1=$3
COLUNA2=$4
arq1=$1
arq2=$2

if [ "$4" = "" ]; then
COLUNA2=$COLUNA1
fi


case "$COLUNA1" in
[0-99] )

awk "{ print \$$COLUNA1 }" $arq1 | while read line_arq1
do
COUNT=`expr $COUNT + 1`
line_arq2=`awk "NR==$COUNT{ print \$ $COLUNA2 }" $arq2`
if [ "$line_arq1" != "$line_arq2" ]; then
echo "xdiff -> $line_arq1 $line_arq2"
fi
done

;;

* )
help
;;
esac



5. Tentando fazer loop entre linhas de dois arquivos

Carlos
krlsdu

(usa Ubuntu)

Enviado em 09/06/2011 - 16:49h

Vou testar a solução dos amigos e mando respostas logo obrigado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts