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

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

Если какое-либо значение совпадает, выполните:

1) Замените значения в file2 для столбцов 2 и 3, используя информацию из file1, столбцы 5 и 6

2) Замените строку ($ 1, 1,5) и строка ($ 1,6,5) в файле2 со значениями столбцов 7 и 8 из файла1

3) Добавьте символ R для замененных строк и O для незаменяемых строк.

file1

2,100,31431,37131,999991.70,0000000.30,11111,22222,3
3,100,31431,37471,111113.20,1111111.30,22222,33333,4

file2

3143137113 318512.50 2334387.50 100
3143137131 318737.50 2334387.50 100
3143137201 319612.50 2334387.50 100
3143137471 322987.50 2334387.50 100
3143137491 323237.50 2334387.50 100

Желаемый вывод:

31431,37113,318512.50,2334387.50,100,O
11111,22222,999991.70,0000000.30,100,R
31431,37201,319612.50,2334387.50,100,O
22222,33333,111113.20,1111111.30,100,R
31431,37491,323237.50,2334387.50,100,O

Я пытался

awk '
BEGIN{
  OFS=","
}
FNR==NR { 
f1_56[$3$4]=($5 OFS $6)
f1_78[$3$4]=($7 OFS $8)
          next
        }
{$(NF+1)="O"}
$1 in f1_56 {
  split(f1_56[$1], a, OFS)
  $2 = a[1]
  $3 = a[2]
  split(f1_78[$1], a, OFS)
  $1=a[1] OFS a[2]
  $NF="R"
} 1
' FS=, file1 FS=' ' file2

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

1 Ответ

0 голосов
/ 20 февраля 2019
awk '
BEGIN{
  OFS=","
}
FNR==NR { 
    f1_5[$3$4]=$5
    f1_6[$3$4]=$6
    f1_78[$3$4]=$7 OFS $8
    next
}
$1 in f1_78{
    $(NF+1)="R"
    $2=f1_5[$1]
    $3=f1_6[$1]
    $1=f1_78[$1]
    print
    next
}
{
    $(NF+1)="O"
    $1=substr($1,1,5) OFS substr($1,6,5)
} 
1 ' FS=, file1 FS=' ' file2

FS=, до того, как файлы равны переключению -F, и равны FS="," в блоке BEGIN.
substr для вспомогательной строки.
Ваш собственный код требует слишком много усилий, объединитеи затем снова разделить, может также просто использовать еще одну переменную для хранения другого поля.
Вы идете в правильном направлении, хотя, добились хорошего прогресса.

Попробуйте замедлить, прочитайте manual и подумай.Сначала вы можете загрузить его.

Поместите один и тот же код в одну строку:

awk 'BEGIN{OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, file1 FS=' ' file2

Он такой же, как:

awk 'BEGIN{FS=OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' file1 FS=' ' file2

, также как:

awk -F, 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' OFS=, file1 FS=' ' file2

По сути, так же, как:

awk 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_5{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, OFS=, file1 FS=' ' file2

Вы можете видеть, как мы помещаем переменные разделителя здесь и там, иногда используем -F, иногда внутри блока BEGIN, иногда до илимежду чтением файлов или даже их смешиванием, это из-за предпочтения ответчика и / или в некоторых случаях для краткости.

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