Bash vlookup вид решения - PullRequest
0 голосов
/ 30 октября 2018

У меня есть два файла,
Файл 1

2,1,1,1,Test1,1540584051,52
6,5,1,1,Test2,1540579206,54
3,3,0,0,Test3,1540591243,36

Файл 2

2,1,0,2,Test1,1540584051,52
6,5,0,2,Test2,1540579206,54

Я хочу посмотреть значение столбца 7 из файла 1, чтобы проверить, совпадает ли оно со значением столбца 7 из файла 2, и при совпадении заменить эту строку в файле 2 соответствующей строкой в ​​файле 1. Таким образом, результат будет

2,1,1,1,Test1,1540584051,52
6,5,1,1,Test2,1540579206,54

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

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Это может сработать для вас (GNU sed):

sed -r 's|^([^,]*,){6}([^,]*).*|/^([^,]*,){6}\2/s/.*/&/p|' file1 | sed -rnf - file2

Превратите file1 в скрипт sed и, используя 7-е поле в качестве поиска ключа, замените любую строку в file2, которая соответствует.

В вашем примере седьмое поле является последним, поэтому короткая версия приведенного выше решения:

sed -r 's|.*,(.*)|/.*,\1/s/.*/&/p|' file1 | sed -nf - file2
0 голосов
/ 30 октября 2018

Вы можете сделать это с помощью следующего скрипта:

BEGIN { FS="," }

NR==FNR {
    lookup[$7] = $0
    next
}

{
    if (lookup[$7] != "") {
        $0 = lookup[$7]
    }
    print
}

END {
    print ""
    print "Lookup table used was:"
    for (i in lookup) {
        print "   Key '"i"', Value '"lookup[i]"'"
    }
}

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

Переменные NR и FNR - это, соответственно, номер строки входного потока full (все файлы) и номер строки current файла в входной поток. Когда вы обрабатываете первый (или единственный) файл, они будут равны, поэтому мы используем это как средство для простого хранения строк из первого файла, введенных в поле седьмое.

Когда NR и FNR не равны, это потому, что вы запустили второй файл, и именно здесь мы хотим заменить строки, если их ключ существует в первом файле.

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

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


Вы увидите вывод в следующем транскрипте, надеясь, что он работает правильно:

pax$ cat file1
2,1,1,1,Test1,1540584051,52
6,5,1,1,Test2,1540579206,54
3,3,0,0,Test3,1540591243,36

pax$ cat file2
2,1,0,2,Test1,1540584051,52
6,5,0,2,Test2,1540579206,54

pax$ awk -f sudarshan.awk file1 file2
2,1,1,1,Test1,1540584051,52
6,5,1,1,Test2,1540579206,54

Lookup table used was:
   Key '36', Value '3,3,0,0,Test3,1540591243,36'
   Key '52', Value '2,1,1,1,Test1,1540584051,52'
   Key '54', Value '6,5,1,1,Test2,1540579206,54'

Если вам нужен как можно более короткий однострочник для использования в вашем скрипте, просто используйте:

awk -F, 'NR==FNR{x[$7]=$0;next}{if(x[$7]!=""){$0=x[$7]};print}' file1 file2

хотя я сам предпочитаю читаемую версию.

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