Se as linhas forem idênticas e você só quiser saber se houver linhas extras em um arquivo ou outro, você poderá usar o tipo & diff (e substituição de processo aqui):
$ diff -B <(sort v1.tcl) <(sort v2.tcl)
2c2,3
< foo1
---
> foo2
> goodbye2
Com o -B
do diff para ignorar linhas em branco. Você pode usar grep -n [pattern] file
para descobrir em qual linha o padrão está (talvez com uma ou uma combinação de grep
, cut
, sed
, awk
), se isso for importante.
Aqui está uma resposta mais completa, mostrando o arquivo e o número da linha contendo correspondências. Não usa sed ou awk, apenas bash, cut, grep ... aqui está tudo (essencialmente) em uma linha:
diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line; do if \
echo "$line" | grep -q "^<"; then grep -F -n -H \
"$(echo "$line"|cut -c3-)" v1.tcl ; elif echo "$line" | grep -q \
"^>"; then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl ; fi done
Ou dividido em várias linhas:
diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line
do
if echo "$line" | grep -q "^<"
then grep -F -n -H "$(echo "$line"|cut -c3-)" v1.tcl
elif echo "$line" | grep -q "^>"
then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl
fi
done
E, dependendo dos seus arquivos de entrada (especialmente se você tiver linhas com barras invertidas), estou usando essas opções para ler & grep:
-
read -r
não permite que barras invertidas escapem de qualquer caractere -
grep -F
Interprete PATTERN como uma lista de sequências fixas (em vez de expressões regulares), separadas por novas linhas, as quais devem ser correspondidas
Além disso, usando comentários do Pimp Juice IT , se houver barras invertidas para linhas nos arquivos de entrada grep fornece o erro "file: line Trailing backslash". Usar a opção -F
para que o grep limpe o erro de barra invertida no final resulta em uma solução somente menor do grep:
grep -FvHn -f v2.tcl v1.tcl ;grep -FvHn -f v1.tcl v2.tcl
opções do grep usadas:
-
-f
Obtém padrões de FILE, um por linha. -
-F
Interprete PATTERN como uma lista de sequências fixas (em vez de expressões regulares), separadas por novas linhas, as quais devem ser correspondidas -
-v
Inverte o sentido de correspondência para selecionar linhas não correspondentes. -
-H
Imprime o nome do arquivo para cada correspondência -
-n
Prefixe cada linha de saída com o número de linha baseado em 1 em seu arquivo de entrada.