У меня есть 2 файла:
2 m1.small
1 m3.large
2 m3.medium
2 t1.micro
1 t2.large
7 t2.medium
4 t2.micro
7 t2.small
и б:
1 c4.2xlarge
1 c4.large
2 m1.small
1 m3.large
3 m3.medium
1 m4.large
3 t1.micro
3 t2.large
11 t2.medium
7 t2.micro
7 t2.small
Когда я использую sdiff, я получаю совсем другое:
$ sdiff a b
2 m1.small | 1 c4.2xlarge
1 m3.large | 1 c4.large
2 m3.medium | 2 m1.small
2 t1.micro | 1 m3.large
1 t2.large | 3 m3.medium
7 t2.medium | 1 m4.large
4 t2.micro | 3 t1.micro
7 t2.small | 3 t2.large
> 11 t2.medium
> 7 t2.micro
> 7 t2.small
В то время как я ясно вижу совпадение по крайней мере
2 m1.small
1 m3.large
7 t2.small
Почему это так, и могу ли я что-нибудь сделать для оптимизации результата, получаемого от diff.
Я также пробовал использовать meld (инструмент Windows diff), и это дает мне точно такой же результат.
Утилиты различного типа будут сравнивать файлы построчно, в то время как вас, кажется, интересует, являются ли строки общими для этих двух файлов.
Утилита comm может быть тем, что вы ищете, однако файлы потребуют некоторой предварительной обработки (порядок полей и сортировка):
cat a | awk '{ print $2 " " $1}' | sort > as
cat b | awk '{ print $2 " " $1}' | sort > bs
а затем вы можете выполнить comm:
comm as bs
который дает вывод в 3 столбцах (присутствует в левом поле, в правом поле или в обоих):
c4.2xlarge 1
c4.large 1
m1.small 2
m3.large 1
m3.medium 2
m3.medium 3
m4.large 1
t1.micro 2
t1.micro 3
t2.large 1
t2.large 3
t2.medium 11
t2.medium 7
t2.micro 4
t2.micro 7
t2.small 7
Также возможно выдавать только строки, встречающиеся только в левом файле (comm -2 -3
) или правильный файл (comm -1 -3
) и т.д.
Я думаю, что это максимально близко к результату, который вы можете получить.
На самом деле этот вопрос выглядит примерно так же, как https://stackoverflow.com/questions/373810/unix-command-to-find-lines-common-in-two-files
Альтернативное решение comm
можно найти там, чтобы просто определить общие строки, используя awk. Я воспроизвожу его здесь, потому что он очень элегантен:
awk 'NR==FNR{arr[$0];next} $0 in arr' a b