Как сравнить два файла, используя AWK или GREP - PullRequest
0 голосов
/ 18 февраля 2020

Итак, у меня два вопроса, у меня есть два файла, которые я пытаюсь отсортировать и отфильтровать В каждом из этих двух файлов есть два столбца, в которых file1 - это IP и порт, а в file2 - домен и IP.

file1:

Address,Port
1.2.3.4,8080
4.5.6.7,80
6.7.8.9,443

file2:

Domain,IP
google.com,1.2.3.4
google.fe,6.7.8.9
admin.ko,3.2.4.5

Итак, первый вопрос: я хочу найти IP-адреса в file1, которые не сопоставьте любые IP-адреса, расположенные в файле 2.

Я пытался использовать awk, и вот что я использовал:

awk -F',' FNR==NR{ a[$2]; next } !($1 in a)' file2 file1

Так что я действительно не очень хорошо понимаю awk, так что может кто-то тоже помогите мне понять каждый раздел этой команды awk, которую вы предоставляете:)

Desired output:

Address,Port,Status
1.2.3.4,8080,Present
4.5.6.7,80,Not-Present
6.7.8.9,443,Present

Следующий вопрос, я понятия не имею, как это сделать, так любезно помогите.

Второй вопрос: так что я хочу перечислить тот же желаемый результат, что и первый, но на этот раз я хочу добавить столбец домена.

Desired output:

Address,Port,Domain,Status
1.2.3.4,8080,google.com,Present
4.5.6.7,80,NULL,Not-Present
6.7.8.9,443,google.fe,Present

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

1) Это очень близко к вашей первоначальной попытке ... Мы просто добавляем столбец 3 по-разному в зависимости от FNR.

Примечания:

  • Заголовок никогда не содержит IP поэтому сохранение его в a[] не имеет большого значения.
  • Важно значение 1 в конце скрипта, побочный эффект выводится на стандартный вывод.
    awk -F, -v OFS=, '
        FNR == NR { a[$2] = ""; next }
        FNR == 1  { $3 = "Status" }
        FNR != 1  { $3 = (($1 in a) ? "Present" : "Not-Present") }
        1' file2 file1

2 ) Мы используем a[] для хранения домена в этом случае и изменим столбцы 3 и 4 на этот раз соответственно.

    awk -F, -v OFS=, '
        FNR == NR { a[$2] = $1; next }
        FNR == 1  { $3 = "Domain"; $4 = "Status" }
        FNR != 1  {
            if ($1 in a) {
                $3 = a[$1];  $4 = "Present"
            } else {
                $3 = "NULL"; $4 = "Not-Present"
            }
        }
        1' file2 file1
1 голос
/ 18 февраля 2020

Ниже приведено полное объяснение упомянутого вами кода, пожалуйста go через него.

awk -F',' '    ##Setting awk program here and setting comma as field separator for all lines here.
FNR==NR{       ##Checking condition if FNR==NR which will be TRUE when first Input_file named file2 is being read.
  a[$2]        ##Creating an array named a with index $2 of current line here.
  next         ##next will skip all further statements from here.
}
!($1 in a)     ##Checking condition if $1 is NOT present from Input_file1 then print that line from Input_file1.
' file2 file1  ##Mentioning Input_file names here.


Для вашего второго вопроса вы можете попробовать следующий код.

awk '
BEGIN{
  FS=OFS=","
}
FNR==1{
  if(++count==1){
    val=$0
  }
  if(++count==2){
    print val,$1,"Status"
  }
  next
}
FNR==NR{
  a[$2]=$1
  next
}
{
  print $0,$1 in a?"Present":"Not-Present"
}
' file2  file1
0 голосов
/ 18 февраля 2020
awk -F,  '
          BEGIN{OFS=","}/*Set output file descriptor*/
          FNR==1{next} /*Skip in case of header*/
          NR==FNR{a[$2]=$1;next}/*Store ips in associative array from file2 */
          {/* Process records in file1*/
           if(a[$1])
                   {$3="present"}
           else
                   {$3="not present"}
          print 
          }' file2 file1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...