差分行番号を印刷するには?
たとえば、ファイル 1 をファイル 2 と比較し、ファイル 2 の差分レコードの行番号を印刷します。
ファイル1から:
userD
user3
userA
user1
userB
そして
ファイル2から:
user3
userB
userX
user1
user7
予想される結果:- file2の違いは行番号3,5です。
答え1
$ grep -n -v -f file1 file2
3:userX
5:user7
これは、「()を除いて()内のすべての行を教えてください。file2
行番号()を使用してください」という意味です。-v
file1
-f file1
-n
最初の部分だけが必要な場合は、以下をフィルタリングしてくださいcut
。
$ grep -n -v -f file1 file2 | cut -d ':' -f 1
3
5
答え2
bash-4.1$ cat file1
userD
user3
userA
user1
userB
bash-4.1$ cat file2
user3
userB
userX
user1
user7
bash-4.1$ awk 'NR==FNR{Arr[$0]++;next}!($0 in Arr){print FNR}' file1 file2
3
5
答え3
sdiff file1 file2 | sed -n '/|/='
2つのファイルを並べて比較し、他の行にのみ行番号を表示します。
答え4
Bashスクリプトは、file1にないfile2のすべての行の行番号を印刷します。
#!/usr/bin/env bash
# read files into arrays
mapfile -t a < file1
mapfile -t b < file2
# copy file1 into an associative array
declare -A lines
for i in "${!a[@]}" ; do
lines["${a[$i]}"]=$i
done
# loop through file2 and report any line numbers for lines missing from file1
for i in "${!b[@]}" ; do
if [ "${lines[${b[$i]}]}" == "" ] ; then
# echo line number for extra line
echo $(($i + 1))
fi
done