Как сравнить 2 файла, в которых встречается несколько раз, и вывести дополнительную информацию? - PullRequest
0 голосов
/ 21 июня 2020

В настоящее время я использую сценарий awk для сравнения 2 файлов со случайными числами в непоследовательном порядке. Он отлично работает, но есть только одно условие, которое я хотел бы выполнить в будущем.

Текущая функция awk

awk '
{
  $0=$0+0
}
FNR==NR{
  a[$0]
  next
}
($0 in a){
  b[$0]
  next
}
{ print }
END{
  for(j in a){
    if(!(j in b)){ print j }
  }
}
'  compare1.txt compare2.txt

Что функция выполняет в настоящее время?

  1. Выводит список всех чисел, которые присутствуют в compare1, но не в compare 2, и наоборот

  2. Если какое-либо число имеет ноль в своем префиксе, игнорируйте нули при сравнении ( в основном абсолютное значение числа должно отличаться, чтобы его можно было рассматривать как несоответствие) Пример - 3 следует считать совпадающим с 003, а 014 следует считать совпадающим с 14, 008 с 8 и т. д. c

  3. При необходимости. Также учитывается число совпадающих, даже если они не обязательно находятся в одной строке в обоих файлах.

Требуется дополнительное условие

В своей текущей форме эта функция работает таким образом, что если файл имеет несколько экземпляров числа, а другой файл имеет хотя бы одно появление того же числа, это считается Число совпадений для обоих повторов. Мне нужно, чтобы функция awk была отредактирована для вывода любого дополнительного вхождения числа

cat compare1.txt

57
11
13
3
889
014
91
775

cat compare2.txt

003
889
13
14
57
12
90
775
775

Ожидаемый результат

12
90
11
91
**775**

Число, отмеченное здесь в конце, в настоящее время не отображается в выводе моей текущей функции awk (2 случая - 1 случай)

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Как упоминалось в { ссылка }, это задание, которое существует для comm:

$ comm -3 <(awk '{print $0+0}' compare1.txt | sort) <(awk '{print $0+0}' compare2.txt | sort)
11
    12
    775
    90
91

и избавления от пробелов:

$ comm -3 <(awk '{print $0+0}' compare1.txt | sort) <(awk '{print $0+0}' compare2.txt | sort) |
    awk '{print $1}'
11
12
775
90
91
1 голос
/ 21 июня 2020

вам просто нужно подсчитать вхождения и учесть их при сопоставлении ...

$ awk '{k=$0+0} 
       NR==FNR {a[k]++; next} 
       !(k in a && a[k]-->0); 
       END {for(k in a) while(a[k]-->0) print k}' file1 file2

12
90
775
11
91

обратите внимание, что, как и в исходном скрипте, нет сравнения абсолютных значений, которое вы можете легко добавить, просто изменив k в первой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...