Если два столбца совпадают, измените третий - PullRequest
0 голосов
/ 04 сентября 2018

Файл 1.txt:

13002:1:3:6aw:4:g:Dw:S:5342:dsan
13003:5:3s:6s:4:g:D:S:3456:fdsa
13004:16:t3:6:4hh:g:D:S:5342:inef

Файл 2.txt:

13002:6544
13003:5684

Мне нужно заменить старые данные в столбце 9 1.txt новыми данными из столбца 2 2.txt, если они существуют. Я думаю, что это можно сделать построчно, так как оба файла имеют одинаковое поле столбца 1. Это размер файла 3Gb. Я играл с awk, но не могу добиться следующего.

Я пытался сделать следующее:

awk 'NR==FNR{a[$1]=$2;} {$9a[b[2]]}' 1.txt 2.txt

Ожидаемый результат:

13002:1:3:6aw:4:g:Dw:S:6544:dsan
13003:5:3s:6s:4:g:D:S:5684:fdsa  
13004:16:t3:6:4hh:g:D:S:5342:inef 

1 Ответ

0 голосов
/ 04 сентября 2018

Кажется, у вас есть несколько странных опечаток в вашей попытке. Вы хотите заменить $ 9 значением из массива, если оно определено. Кроме того, вы хотите убедиться, что Awk использует двоеточие в качестве разделителя как на входе, так и на выходе.

awk -F : 'BEGIN { OFS=FS }
    NR==FNR{a[$1]=$2; next}
    $1 in a {$9 = a[$1] } 1' 2.txt 1.txt

Обратите внимание, что 2.txt является первым, так что NR==FNR верно, когда вы читаете этот файл, но не когда вы начинаете читать 1.txt. next в первом блоке не позволяет Awk выполнить второе условие, пока вы читаете первый файл. И последний 1 является сокращением для безусловного print, которое, конечно, будет выполняться для каждой строки во втором файле, независимо от того, заменяли ли вы что-либо.

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