2つのファイル間の共通行とそのファイルの行番号を印刷します。

2つのファイル間の共通行とそのファイルの行番号を印刷します。

2つのファイルがあります。あるファイルの内容を別のファイルの内容と比較したい。 2つのファイルの間に一致する行がある場合は、各ファイルの行と行番号を印刷します。例:

ファイル1:

ABC
PQR
MNO
XYZ

ファイル2:

qqqq
wewe
ABC
acdd
abcc
nop
MNO

予想出力:

ABC       1      3
MNO       3      7
..

答え1

awk最初のファイルを処理し、行()とその行番号()(インデックス/値)を連想配列()に保存し、2番目のファイルを処理して行が配列$0インデックスNRl[$0]ある場合、印刷された値はl[$0]現在の行番号(FNR)です。

awk 'FNR==NR{l[$0]=NR; next}; $0 in l{print $0, l[$0], FNR}' file1 file2

答え2

#!/bin/sh

count_match() {
    grep -x -n -F -f "$1" "$2" | sed 's/\([0-9]*\):\(.*\)/\2 \1/' | sort
}

count_match file2 file1 > /tmp/$$A
count_match file1 file2 > /tmp/$$B
join /tmp/$$[AB]

rm /tmp/$$[AB]

grep使用されるオプションは次のとおりです。

-n一致する行番号を印刷する 行全体と一致する
-xリテラル
-F文字列のみ一致 - 正規表現なし
-f filenameファイルから検索パターンを読み込む (この場合は file1 または file2)

sedフィールドの順序を切り替えてコロンを削除するために使用されます:

sort出力。

join両方の一時ファイルの内容です。

これは、上記の例のコマンドの使用方法と出力を示しています。

$ grep -n -F -f file2 file1
1:ABC
3:MNO
$
$ grep -x -n -F -f file2 file1 | sed 's/\([0-9]*\):\(.*\)/\2 \1/' 
ABC 1
MNO 3
$
$ grep -x -n -F -f file1 file2 | sed 's/\([0-9]*\):\(.*\)/\2 \1/'
ABC 3
MNO 7
$ 

関連情報