awk сравнить два столбца в двух файлах результат печати - PullRequest
0 голосов
/ 25 сентября 2019

В awk ниже я пытаюсь сопоставить каждую строку $2 в f1 и f2, а затем $1 в f1 и f2, и если обе совпадают, то $3«MATCH» в противном случае $3 - это «MISMATCH».Результат awk, приведенный ниже, не будет выполнен, пока я не удалю один из операторов if.Спасибо:).

f1

1234 aaa
5678 xxxx
1244 yyyy
2255 zzzz

f2

5678 xxxx
224 zzzz
1244 yyyy
1234 aaa

желательно

1234 aaa MATCH
5678 xxxx MATCH
1244 yyyy MATCH
2255 zzzz MISMATCH

awk

awk 'if($2==$2) && if($1==$1){print $3,"MATCH"} else {print $3,"MISMATCH"}}' f1 f2

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Не могли бы вы попробовать следующее (Это напечатает те значения, которые присутствуют в файле1, а не в файле2 для печати ключевых слов без совпадений).

awk '
FNR==NR{
  a[$1]=$0
  next
}
{
  print $0,$1 in a?"MATCH":"NON-MATCH"
}'  Input_file2  Input_file1


Дополнительное решение: Если вы хотите напечатать несоответствующие строки для обоих файлов (поскольку приведенный выше код печатает только те, которые находятся в файле1, а НЕ в файле2).

awk '
FNR==NR{
  a[$1]=$2
  next
}
{
  print $0,$1 in a?"MATCH":"NON-MATCH-FILE1"
  b[$1 in a?$1:""]
}
END{
  for(i in a){
     if(!(i in b)){
        print a[i]" NON-MATCH-FILE2"
     }
  }
}'  Input_file2  Input_file1
1 голос
/ 25 сентября 2019

AWK не читает входные файлы одновременно.
Сначала вам нужно прочитать f2 в массив, затем вы можете использовать массив, чтобы определить, что будет в $3 при обработке f1.

awk 'NR==FNR{a[$1]=$2;next} {$3=(($1 in a&&a[$1]==$2)?"":"MIS")"MATCH"} 1' f2 f1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...