Um forro para descobrir se as primeiras linhas de dois arquivos são idênticas

2

Existe um uso simples de head e cmp (ou outro) para conseguir isso?

    
por StamfordBingo 02.12.2010 / 16:17

2 respostas

5

Você pode usar o status de saída de diff e head dentro da substituição do processo:

[kbrandt@localhost ~]$ echo arf > foo
[kbrandt@localhost ~]$ echo arf > foo1
[kbrandt@localhost ~]$ diff <(head -n1 foo) <(head -n1 foo1)
[kbrandt@localhost ~]$ echo $?
0
[kbrandt@localhost ~]$ echo foo > foo1
[kbrandt@localhost ~]$ diff <(head -n1 foo) <(head -n1 foo1)
1c1
< arf
---
> foo
[kbrandt@localhost ~]$ echo $?
1
[kbrandt@localhost ~]$ 

O Diff compara os arquivos, se o status de saída for zero, do que os arquivos correspondem. Diferente de zero significa que eles não corresponderam ou houve um erro ao executar o diff, o que parece improvável. $? é uma variável de shell que possui o status de saída do comando anterior. Você pode redirecionar a saída do diff adicionando > /dev/null ao final do comando diff se não quiser vê-lo na tela:

[kbrandt@localhost ~]$ diff <(head -n1 foo) <(head -n1 foo1) > /dev/null
[kbrandt@localhost ~]$ echo $?
1
    
por 02.12.2010 / 16:20
2

Aqui está uma maneira de fazer isso no Bash sem usar três chamadas para utilitários externos. Ele também funciona em shells POSIX que não têm substituição de processo:

read a<file1; read b<file2; [ "$a" = "$b" ]; echo $?

Aqui está outra maneira de usar o AWK:

awk 'FNR==1{a[NR]=$0; if (NR==2) exit a[1]!=a[2]; nextfile}' file1 file2

Observe que as comparações do AWK retornam 1 para true, portanto, estou usando != para que o shell obtenha um 0, que acredita ser verdadeiro.

    
por 02.12.2010 / 22:28