Проверьте, присутствует ли список шаблонов из file1.csv в file2.csv и измените записи в file2.csv

У меня есть 2 файла file1.csv и file2.csv

file1.csv содержит только 1 столбец с сотнями строк.

aaa
ddd
fff
ggg

file2.csv содержит 5 полей с тысячами строк.

aaa,2,3,4,
aaa,2,3,4, 
bbb,2,3,4,
ccc,2,3,4, 
ccc,2,3,4, 
ddd,2,3,4, 
ddd,2,3,4,
ddd,2,3,4,  
eee,2,3,4, 
fff,2,3,4, 
ggg,2,3,4, 
hhh,2,3,4, 
hhh,2,3,4,   

Моя задача - проверить, совпадает ли col1, присутствующий в file1.csv, с col1 в fil2.csv, а затем изменить 5-й столбец на Y в file2.csv

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

aaa,2,3,4,Y
aaa,2,3,4,Y 
bbb,2,3,4, 
ccc,2,3,4, 
ccc,2,3,4, 
ddd,2,3,4,Y
ddd,2,3,4,Y
ddd,2,3,4,Y  
eee,2,3,4, 
fff,2,3,4,Y 
ggg,2,3,4,Y 
hhh,2,3,4, 
hhh,2,3,4, 

Я попробовал

for i in $(cat file1.csv); do awk -F "," '$1==$i{$5="Y"}1' OFS="," file2.csv ; done

Но я получаю только сопоставленные записи, но не несопоставленные записи.

Есть ли лучший способ, которым я могу достичь этого в UNIX, используя awk, sed или другую обычную утилиту.

РЕДАКТИРОВАТЬ: обновить вопрос с четким примером

0
задан Abhinay 17 January 2019 в 10:38
поделиться

2 ответа

Нет необходимости делать это так, просто awk читает два файла, это нормально:

awk -F, 'NR==FNR{a[$1]++;next;}a[$1]{$5="Y"}1' file1.csv file2.csv

Не уверены, что заголовок и вторая строка - это ваш способ объяснения, если вы хотите избавиться от них :

awk -F, 'NR==FNR{a[$1]++;next;}a[$1]{$5="Y"}FNR>2' file1.csv file2.csv

Обратите внимание, что если file1.csv может быть пустым, вы должны изменить NR==FNR на другие методы проверки файлов, такие как ARGIND==1 для GNU awk, или FILENAME=="file1.csv" и т. Д.

[1139 ] Если имеется огромное количество данных для работы, изменение a[$1]++ на a[$1]=1 немного улучшит скорость.
Также, если вы хотите сохранить заголовок (или 2-ю строку), то лучше начинать изменять массив a, когда FNR>1 или FNR>2. Усовершенствуйте команду самостоятельно, я уверен, что вы поняли;)

NR==FNR означает первый файл, потому что NR означает N число от R записей теперь FNR означает текущий F иле N номер R экордов.
a - это массив для сохранения $1 в качестве ключей.
next пропустить выполнение другого блока.

Когда NR==FNR равно false, это означает, что это не первый файл, первый блок не будет выполнен.
(Вы также можете использовать NR>FNR перед блоком, чтобы указать его, но так как я использовал next в блоке NR==FNR, так что в этом нет необходимости.)
Затем запускаются другие директивы, a[$1] заключается в том, чтобы судить, существует ли ключ в массиве a или нет (если обратиться к значению, буквально проверьте, что key exists фактически должно быть $1 in a), если он существует, то измените $ 5.
Последний 1 должен указывать истинное значение, это сокращение для {print}.
(Поскольку выражение без блока подразумевает {print}, и блок выполняется, когда вышеприведенное выражение рассчитывается как true, для которого 1 всегда верно.)

0
ответ дан Tiw 17 January 2019 в 10:38
поделиться

Вы можете попробовать решение Perl

$ perl -F, -lane 'BEGIN {%kv=map{chomp;

Вы можете попробовать решение Perl

[110].=>1} qx(cat file1.csv) } print "

Вы можете попробовать решение Perl

[110].", $kv{$F[0]}? "Y" : "" ' file2.csv aaa,2,3,4,Y aaa,2,3,4,Y bbb,2,3,4, ccc,2,3,4, ccc,2,3,4, ddd,2,3,4,Y ddd,2,3,4,Y ddd,2,3,4,Y eee,2,3,4, fff,2,3,4,Y ggg,2,3,4,Y hhh,2,3,4, hhh,2,3,4, $ cat file1.csv aaa ddd fff ggg $ cat file2.csv aaa,2,3,4, aaa,2,3,4, bbb,2,3,4, ccc,2,3,4, ccc,2,3,4, ddd,2,3,4, ddd,2,3,4, ddd,2,3,4, eee,2,3,4, fff,2,3,4, ggg,2,3,4, hhh,2,3,4, hhh,2,3,4, $
.
0
ответ дан stack0114106 17 January 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: