Программа, которая сравнивает условные повторы строк и выводит определенную сумму в AWK

#awk

#awk

Вопрос:

У меня большая проблема. Мне нужно написать программу, которая сравнивает строки между двумя файлами (File1, File2 и мы печатаем сумму повторений в другом файле Sum1, но есть несколько условий. Мы проверяем, что у нас есть в column2 ($ 2), наиболее важными являются повторы SOL, SOL может повторяться 2 раза, 3 раза или 4 раза:

  1. Для 2 одинаковых повторов SOL мы добавляем один

а) В File1 и в File2

 DGD107 SOL5989
DGD107 SOL5989
 

мы добавляем 1 к сумме

б) В File1 и в File2

 DGD167 SOL5989
DGD1071 SOL5989
 

мы добавляем 1 к сумме

  1. Для 3 одинаковых повторений SOL мы добавляем 2 (у нас есть 3 разных типа 3-кратных повторений) «

а) В File1 и в File2

 DGD67 SOL3641
DGD1911 SOL3641
DGD123 SOL3641
 

мы добавляем к сумме 2

б) В File1 и в File2

 DGD87 SOL1234
DGD5019 SOL1234
DGD5019 SOL1234
 

мы добавляем к сумме 2
c) В File1 и в File2

 DGD429 SOL619
DGD429 SOL619
DGD429 SOL619
 

мы добавляем к сумме 2

  1. Для 4 одинаковых повторений SOL мы также добавляем 2 (у нас есть 5 разных типов 4-кратных повторений)

а) В File1 и в File2

 DGD5 SOL2848
DGD5 SOL2848
DGD5 SOL2848
DGD59 SOL2848
 

мы добавляем к сумме 2

б) В File1 и в File2

 DGD99 SOL4509
DGD99 SOL4509
DGD99 SOL4509
DGD99 SOL4509
 

мы добавляем к сумме 2

c) В File1 и в File2

 DGD7 SOL601
DGD34 SOL601
DGD34 SOL601
DGD63 SOL601
 

мы добавляем к сумме 2

d) В File1 и в File2

 DGD74 SOL130
DGD78 SOL130
DGD18 SOL130
DGD72 SOL130
 

we add to sum 2

e) In File1 and in File2

 DGD7 SOL172
DGD34 SOL172
DGD34 SOL172
DGD7 SOL172
 

мы добавляем к сумме 2

Хорошо, итак, это пример кода (я добавляю пробелы, чтобы помочь вам увидеть это)

Файл1

 DGD5 SOL2848
DGD5 SOL2848
DGD5 SOL2848
DGD59 SOL2848

DGD87 SOL1234
DGD5019 SOL1234
DGD5019 SOL1234

DGD5 SOL5989
DGD5 SOL5989

DGD87 SOL1234
DGD5019 SOL1234
DGD5019 SOL1234

DGD74 SOL130
DGD78 SOL130
DGD18 SOL130
DGD72 SOL130
 

Файл2

 DGD72 SOL782
DGD5 SOL2848
DGD5 SOL2848
DGD72 SOL782

DGD87 SOL1234
DGD5019 SOL1234
DGD5019 SOL1234

DGD107 SOL5989
DGD107 SOL5989

DGD52 SOL571
DGD22 SOL571
DGD5019 SOL1234
DGD5019 SOL1234

DGD74 SOL130
DGD78 SOL130
DGD18 SOL130
DGD72 SOL130
 

Сумма должна быть равна 6 (я дал вам 5 примеров повторений: 1-й 1; 2-й 2; 3-й 0; 4-й 1; 5-й 2).

Я знаю, что это очень сложная задача, но любой совет был бы полезен.

Комментарии:

1. У вас будет больше шансов получить ответ, если вы разместите 1 вопрос с 1 образцом набора входных / выходных данных. Затем вы можете попытаться применить это решение к другим своим проблемам и задать дополнительный вопрос, если не можете в этом разобраться.

2. @EdMorton ты прав. Я попытаюсь разделить свою проблему.

Ответ №1:

Это выведет 6 для данного образца ввода:

 awk '
  NF < 2 {next}
  NR==FNR {
    c1[$2]  = c1[$2]<3
    next
  }
  c1[$2]-->0 amp;amp; c2[$2]   {  sum}
  END {print sum 0}
' file[12]
 

Кажется, что условие 3. (добавление 2 к сумме для 4 повторений) уже выполнено, когда подсчитано 2. (3 повторения). Процесс заключается в следующем: увеличьте сумму, если $ 2 появляется дважды в обоих файлах; и увеличьте сумму еще раз, если $ 2 появляется более чем в два раза в обоих файлах.