Подсчитайте количество одинаковых строк в двух файлах, используя awk - PullRequest
0 голосов
/ 15 апреля 2020

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

Вот как выглядит мой код awk в настоящее время:

awk 'NR==FNR{a[$1FS$2]=$0;next}  {print  (!a[$1FS$2]?$0:"")}' C6H6_1651.com  C6H6_1652.com  | awk 'END { print NR }'

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

Другие варианты этих awk-команд, которые я пробовал:

awk 'NR==FNR{!a[$1FS$2]?$0:"";next}  END { print NR }' C6H6_1651.com C6H6_1652.com

, который выводит 64

awk 'NR==FNR{a[$1FS$2]=$0;next}  {print  (!a[$1FS$2]?$0:"")} END { printf NR }' C6H6_1651.com C6H6_1652.com

, который выводит строку для каждой строки в документе, но единственными строками, содержащими текст, являются те, которые не совпадают между двумя файлы. 64 затем следует за этим блоком текста.

Вот содержимое C6H6_1651.com

%chk=C6H6_1651.chk
%nproc=20
# mp2/cc-pVTZ

C6H6_1651

0 1
 C            0.000000000     1.394800000     0.000000000 
 C            0.000000000    -1.394800000     0.000000000 
 C            1.207900000     0.697400000     0.000000000 
 C           -1.207900000     0.697400000     0.000000000 
 C           -1.207900000    -0.697400000     0.000000000 
 C            1.207900000    -0.697400000     0.000000000 
 C            0.000000000     1.394800000     3.000000000 
 C            0.000000000    -1.394800000     3.000000000 
 C            1.207900000     0.697400000     3.000000000 
 C           -1.207900000     0.697400000     3.000000000 
 C           -1.207900000    -0.697400000     3.000000000 
 C            1.207900000    -0.697400000     3.000000000 
 H            0.000000000     2.482200000     0.000000000 
 H            2.149700000     1.241100000     0.000000000 
 H           -2.149700000     1.241100000     0.000000000 
 H           -2.149700000    -1.241100000     0.000000000 
 H            2.149700000    -1.241100000     0.000000000 
 H            0.000000000    -2.482200000     0.000000000 
 H            0.000000000     2.482200000     3.000000000 
 H            2.149700000     1.241100000     3.000000000 
 H           -2.149700000     1.241100000     3.000000000 
 H           -2.149700000    -1.241100000     3.000000000 
 H            2.149700000    -1.241100000     3.000000000 
 H            0.000000000    -2.482200000     3.000000000 

Вот содержимое C6H6_1652.com

%chk=C6H6_1652.chk
%nproc=20
# mp2/cc-pVTZ

C6H6_1652

0 1
 C            0.000000000     1.394800000     0.000000000 
 C            0.000000000    -1.394800000     0.000000000 
 C            1.207900000     0.697400000     0.000000000 
 C           -1.207900000     0.697400000     0.000000000 
 C           -1.207900000    -0.697400000     0.000000000 
 C            1.207900000    -0.697400000     0.000000000 
 C            0.000000000     1.394800000     3.000000000 
 C            0.000000000    -1.394800000     3.000000000 
 C            1.207900000     0.697400000     3.000000000 
 C           -1.207900000     0.697400000     3.000000000 
 C           -1.207900000    -0.697400000     3.000000000 
 C            1.207900000    -0.697400000     3.000000000 
 H            0.000000000     2.482200000     0.000000000 
 H            2.149700000     1.241100000     0.000000000 
 H           -2.149700000     1.241100000     0.000000000 
 H           -2.149700000    -1.241100000     0.000000000 
 H            2.149700000    -1.241100000     0.000000000 
 H            0.000000000    -2.482200000     0.000000000 
 H            0.000000000     2.482200000     3.000000000 
 H            2.149700000     1.241100000     3.000000000 
 H           -2.149700000     1.241100000     3.000000000 
 H           -2.149700000    -1.241100000     3.000000000 
 H            2.149700000    -1.241100000     3.000000000 
 H            0.000000000    -2.482200000     3.000000000 

1 Ответ

2 голосов
/ 16 апреля 2020

Если вы хотите сделать это в awk, попробуйте. Далее будут показаны строки, которые присутствуют в обоих файлах.

awk '
FNR==NR{
  array[$0]
  next
} 
($0 in array)
' Input_file1  Input_file2

ИЛИ, чтобы получить количество строк в самой awk, попробуйте:

awk '
FNR==NR{
  array[$0]
  next
} 
($0 in array){
  count++
}
END{
  print "Total matching lines are:" count
}
' Input_file1  Input_file2

Чтобы узнать строки, присутствующие в файле1 а не в файле2 попробуйте:

awk '
FNR==NR{
  array[$0]
  next
} 
!($0 in array)
' Input_file1  Input_file2

ИЛИ

awk '
FNR==NR{
  array[$0]
  next
} 
!($0 in array){
  count++
}
END{
  print "Total lines found in file1 and NOT in file2 are:"count
}
' Input_file1  Input_file2

Чтобы получить строки, которые присутствуют в файле2, а не в файле1, попробуйте:

awk '
FNR==NR{
  array[$0]
  next
} 
!($0 in array)
' Input_file2  Input_file1

ИЛИ

awk '
FNR==NR{
  array[$0]
  next
} 
!($0 in array){
  count++
}
END{
  print "Total lines found in file2 and NOT in file1 are:"count
}
' Input_file2  Input_file1

Приведенные выше решения (без END block one) будут печатать строки, если вам нужно знать только количество строк, добавляемых | wc -l к указанным выше командам.

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