シェルで2つのファイルの最初のn行の異なる行を表示する方法は?

シェルで2つのファイルの最初のn行の異なる行を表示する方法は?

シェルで2つのファイルの最初の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

ファイルにタブ文字が含まれていないと仮定すると(含まれている場合は別の明示的な区切り文字を選択する)、次のことができます。

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

関連情報