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

Если значения для столбцов 1,2 и 5 в файле1 совпадают со столбцами 1,2 и 9 в файле2.

Затем замените значения в столбце 1,2 файла2, используя информацию из столбцов 3,4 файла1

Добавить символ R для замененных строк и O для строк, не замененных в выходном файле. Также добавьте столбцы 1 и 2 из file1 для сопоставленных записей.

file1

37267.00  37181.00  37267.00  37181.00  2605  
37269.00  37181.00  37267.00  37184.00  2605  
37271.00  37181.00  37271.00  37181.00  2603  
36829.00  37185.00  36820.00  37184.00  2605  
36831.00  37187.00  36831.00  37185.00  2605  
36833.00  37189.00  36833.00  37189.00  2605  
36835.00  37191.00  36831.00  37194.00  2606

file2

37267.00  37181.00  8424   36840.00  37260.00  37146.00  37612.00  36  2605
37269.00  37181.00  8424   36840.00  37260.00  37146.00  37612.00  36  2605
37271.00  37181.00  8424   36840.00  37260.00  37146.00  37612.00  36  2603
36829.00  37185.00  8640   36840.00  37260.00  37146.00  37624.00  36  2605
36831.00  37187.00  8640   36840.00  37260.00  37146.00  37624.00  36  2605
36833.00  37189.00  8640   36840.00  37260.00  37146.00  37624.00  36  2605
36835.00  37191.00  8640   36840.00  37260.00  37146.00  37624.00  36  2606

output desired

37267.00  37181.00  8424   36840.00  37260.00  37146.00  37612.00  36  2605  O 37267.00  37181.00
37267.00  37184.00  8424   36840.00  37260.00  37146.00  37612.00  36  2605  R 37269.00  37181.00
37271.00  37181.00  8424   36840.00  37260.00  37146.00  37612.00  36  2603  O 37271.00  37181.00
36820.00  37184.00  8640   36840.00  37260.00  37146.00  37624.00  36  2605  R 36829.00  37185.00
36831.00  37185.00  8640   36840.00  37260.00  37146.00  37624.00  36  2605  R 36831.00  37187.00
36833.00  37189.00  8640   36840.00  37260.00  37146.00  37624.00  36  2605  O 36833.00  37189.00
36831.00  37194.00  8640   36840.00  37260.00  37146.00  37624.00  36  2606  R 36835.00  37191.00

Я пытался

awk '
FNR==NR{
  a[$1 $2 $5]=$3 $4
  b[$3 $4]=$3
  c[$3 $4]=$4
  next
}
($1 in a){
  $1=b[$1]
  $2=c[$1]
  $1=a[$1]
  found=1
}
{
  $0=found==1?$0",R":$0",O"
  sub(/^...../,"&,")
  $1=$1
  found=""
}
1
' FS=" " file1 FS=" " OFS=" " file2

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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

РЕДАКТИРОВАТЬ: Поскольку OP изменил примерные данные Input_file, поэтому добавьте это решение сейчас.

awk '
FNR==NR{
  a[$3,$4,$5]=$3
  b[$3,$4,$5]=$4
  next
}
{
  val=$1 SUBSEP $2 SUBSEP $9
  val_last=$1 OFS $2
}
(val in a){
  $2=b[val]
  $1=a[val]
  print $0,"R",val_last
  next
}
{
  print $0,"O",val_last
}'  Input_file1  Input_file2  | column -t


Похоже, что ваш ожидаемый результат не соответствует условиям, которые вы объяснили, если это так, попробуйте выполнить следующие действия (протестировано только с вашими показанными образцами).

awk '
FNR==NR{
  a[$1,$2,$5]=$3
  b[$1,$2,$5]=$4
  next
}
{
  val=$1 SUBSEP $2 SUBSEP $9
}
(val in a){
  $2=b[val]
  $1=a[val]
  print $0,"R"
  next
}
{
  print $0,"O"
}'  Input_file1   Input_file2

Почему код OP не работает: Поскольку однажды $1 я изменился с Input_file1, тогда следующий элемент не может быть установлен, так как значение текущей строки в $ 1 изменяется на $ 1 в Input_file1 Теперь.

0 голосов
/ 21 апреля 2019

пробовал на GNU AWK

 awk 'NR==FNR{r[NR]=$0;next} {x=split(r[FNR],a);if(a[1]==$1&&a[2]==$2&&a[5]==$9){$1=a[3];$2=a[4];print $0,"R",a[1],a[2]} else {print $0,"O",a[1],a[2]}}' file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...