Como posso exibir as primeiras n linhas diferentes em dois arquivos de um shell?

Como posso exibir as primeiras n linhas diferentes em dois arquivos de um shell?

Como posso exibir as primeiras n linhas diferentes em dois arquivos de um shell? Eu tentei com grep -vfmas realmente não funciona.

Suponha que n = 5 Esta entrada:

file1

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o

file2

This line is not the same
b
c
d
This is still not the same
Neither is this
g
h
Nor this
DIFFERENT
k
This is not the same, too
m
another different line
o

Produziria a saída:

This line is not the same
This is still not the same
Neither is this
Nor this
DIFFERENT

Responder1

Esta é a minha proposta:

diff -u file1 file2 --unchanged-line-format= --old-line-format= --new-line-format=%L | head -n 5

This line is not the same
This is still not the same
Neither is this
Nor this
DIFFERENT

Responder2

Supondo que seus arquivos não contenham o caractere TAB (se contiverem, escolha outro delimitador inequívoco), você poderia fazer

$ paste file1 file2 | awk -F'\t' '$2 != $1 {print $2; n++} n==5 {exit}'
This line is not the same
This is still not the same
Neither is this
Nor this
DIFFERENT

Responder3

Usando primitivos bash, usando descritores de arquivos fixos para manter as coisas simples. (Não testado)

# open the two files on fd8 and fd9, should have some error checking
exec 8<file1 9<file2
# start the loop
for(c=0;c<6;)
do
    # read a line from first file, don't worry about EOF 
    IFS="" read -r -u 8 l1
    # read a line from second file, exit the loop if EOF
    read -r -u 9 l2 || break
    # loop if the 2 lines are the same
    [ "$l1" -eq "$l2" ] && continue
    # ok, a different line. Output from file2, bump count and loop
    let c++
    printf '%s\n' "$l2"
done
# If we get here we either have hit EOF on file2 or have printed our 6 lines
# Either way just tidy up
# close the file descriptiors
exec 8<&- 9<&-

informação relacionada