Как отобразить первые n разных строк в двух файлах из оболочки?

Как отобразить первые n разных строк в двух файлах из оболочки?

Как мне отобразить первые n разных строк в двух файлах из оболочки? Я пробовал, grep -vfно это не работает.

Предположим, что n = 5. Этот ввод:

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

Вывод будет следующим:

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

решение1

Вот мое предложение:

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

решение2

Предполагая, что ваши файлы не содержат символ TAB (если он есть, выберите другой однозначный разделитель), вы можете сделать следующее:

$ 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

решение3

Использование примитивов bash и фиксированных файловых дескрипторов для простоты. (Не проверено)

# 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<&-

Связанный контент