我有两个文件。我想将一个文件的内容与另一个文件的内容进行比较。如果两个文件之间存在匹配行,则在每个文件中打印该行及其行号。例子:
文件一:
ABC
PQR
MNO
XYZ
文件2:
qqqq
wewe
ABC
acdd
abcc
nop
MNO
预期输出:
ABC 1 3
MNO 3 7
..
答案1
您awk
可以处理第一个文件,将行 ( $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
$