Как мне отобразить первые 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<&-