объединить два файла на основе условия в UNIX - PullRequest
0 голосов
/ 18 октября 2018

У меня есть 2 разных файла, один файл с Cust # и другой с Cusotmer # и именами.Я хочу сравнить два файла на основе Cust # и извлечь эти записи из file2, соответствующие cust #.Я знаю, что это простая операция в SQL, но как это сделать в Unix.Любой, любые предложения .. спасибо всем

файл 1:

Cust #

1  
2  
3
4
5

file2.txt:

Cust # | ad1 |ad2 | ad3 | ad4 | name1 | name2 | name3 | loc1 | loc2 | loc3 | city1 | city2 | city3 | st1 | st2 | st3 | st4

1|eee|ee|||||||||||city3|st1|st2|st3|st4
8|eee|ee|||||||||||city41|st15|st62|st73|st18
B|eee|ee|||||||||||city32|st51|st52|st53|st88
2|eee|ee|||||||||||city31|st13|st62|st3|st99
3|eee|ee|||||||||||city23|st11|st22|st33|st55

вывод.

1|eee|ee|||||||||||city3|st1|st2|st3|st4
2|eee|ee|||||||||||city31|st13|st62|st3|st99
3|eee|ee|||||||||||city23|st11|st22|st33|st55

Ответы [ 2 ]

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

Использование awk:

awk -F\| 'NR==FNR{ids[$1]=1;next}ids[$1]==1' file1 file2

Редактировать - добавить объяснения:

Блок после NR == FNR выполняется при анализе первого файла.Он создает массив с именем «идентификаторы».Когда awk завершил анализ первого файла, массив:

ids[1] = 1
ids[2] = 1
ids[3] = 1
ids[4] = 1
ids[5] = 1

вызывается 'next', чтобы избежать выполнения остальной части скрипта (при разборе первого файла)

ids[$1]==1

будетпроверьте для каждой строки второго файла, если ids [value_inside_first_column] равен 1, затем печатает строку.

Это эквивалентно:

awk -F\| '
    NR==FNR{
        ids[$1]=1
    }
    NR!=FNR{
        if(ids[$1]==1){
            print $0
        }
    }'

Для развлечения с помощью grep, но я предпочитаю версии awk или join:

grep -wF -f file1 file2

Решение grep работает на вашем примере, но оно нестабильно, поскольку оно будет печатать такие строки:

B|eee|ee||||||1|||||city23|st11|st22|st33|st55

Имейте в виду, что выв вашем примере file1 есть лишние пробелы, которые приводят к непредвиденным ошибкам.

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

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

join -t\| -j1 <(sort file1) <(sort file2)

Альтернатива, использующая GNU sed:

sed 's#.*#/^&|/p#' file1 | sed -f - -n file2

Превратить первый файл в скрипт sed и использовать его во втором вызове sedпротив файла 2.

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