Фильтрация записей из одного файла на основе значений, присутствующих в другом файле, с использованием Unix - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть входной файл CSV Входной канал

PK,Col1,Col2,Col3,Col4,Col5    
A,1,2,3,4,5
B,1,A,B,C,D
C,1,2,3,4
D,2,1,2,3
E,5,1,1,1
F,8,1,1,1

Существует CSV-файл с ошибкой вывода, сгенерированный из этого входного файла с первичным ключом

Файл ошибок

    Pk,Error_Reason   
    D,Failure
    E, Failure
    F, Failure

Я хочу извлечь все записи из входного файла и сохранить его в новый файл, для которого есть запись первичного ключа в файле ошибок.

По сути, мой новый файл должен выглядеть так:

Новый входной канал

PK,Col1,Col2,Col3,Col4,Col5    
D,2,1,2,3
E,5,1,1,1
F,8,1,1,1

Я новичок в Unix и пробовал команду Awk.

Подход, который я попробовал, состоит в том, чтобы получить все значения первичного ключа в файл.

akw -F "," '{print $ 2}' error.csv >> error_pk.csv

Теперь мне нужно отфильтровать записи из input.csv для всех значений первичного ключа, присутствующих в error.pk

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Использование awk.Поскольку в файле ошибок есть пробел, его сначала нужно обрезать, для этого я использую sub.Затем, поскольку заголовки первого столбца не идентичны, (PK против Pk), который необходимо обрабатывать отдельно с помощью FNR==1:

$ awk -F, '                      # set separator
NR==FNR {                        # process the first file
    sub(/^ */,"")                # trim leading space
    a[$1]                        # hash the first column
    next  
}
FNR==1 || ($1 in a)' error input # output tthe header record and if match hashed

Вывод:

PK,Col1,Col2,Col3,Col4,Col5    
D,2,1,2,3
E,5,1,1,1
F,8,1,1,1
1 голос
/ 14 апреля 2019

Вы можете использовать grep -f с файлом с элементами поиска. Отрезать на ,.

grep -Ef <(sed -r 's/([^,]*).*/^\1,/' file2) file1

Если вы хотите заголовок на выходе,

1 голос
/ 13 апреля 2019

Вы можете использовать join.

Сначала удалите все после запятой из второго файла
Присоединяйтесь к первому полю из обоих файлов

cat <<EOF >file1
PK,Col1,Col2,Col3,Col4,Col5    
A,1,2,3,4,5
B,1,A,B,C,D
C,1,2,3,4
D,2,1,2,3
E,5,1,1,1
F,8,1,1,1
EOF

cat <<EOF >file2
PK,Error_Reason   
D,Failure
E,Failure
F,Failure
EOF

join -t, -11 -21 <(sort -k1 file1) <(cut -d, -f1 file2 | sort -k1)

Если вам нужно отсортировать файл в соответствии с file1, вы можете нумеровать строки в первом файле, объединить файлы, выполнить повторную сортировку с использованием номеров строк, а затем удалить номера из вывода:

join -t, -12 -21 <(nl -w1 -s, file1 | sort -t, -k2) <(cut -d, -f1 file2 | sort -k1) |
sort -t, -k2 | cut -d, -f1,3-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...