打印两个文件之间的公共行及其在这些文件中的行号

打印两个文件之间的公共行及其在这些文件中的行号

我有两个文件。我想将一个文件的内容与另一个文件的内容进行比较。如果两个文件之间存在匹配行,则在每个文件中打印该行及其行号。例子:

文件一:

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
$ 

相关内容