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
インデックスNR
にl[$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
$