
У меня есть 2 CSV-файла, содержимое которых:
expo1.csv
:
102,GREAT,прилагательное,ENG,p1_0,нет,p2_1,нет,p3,нет,4,да,p5_2,нет,p6,да....,su1,amb,su_09,нет
104,BHAAG,глагол,HIN,p1,да,p2,нет,p3_7,amb,p4,нет,p5,нет,p6_9,да....,sg4_3,да,su119,amb
110,.......,su11_0,amb
и
impo1.csv
:
104,p1,no
102,p2,yes
104,p10,no
110,su11,no
По сути, expo1.csv
это файл на сервере, и impo1.csv
это файл, который я создал для обновления expo1.csv
. Скрипт вносит изменения, expo1.csv
как указано в impo1.csv
после выполнения небольшой обработки в данных impo1 (например, строка 102,p2,yes impo1.csv
обрабатывается, а затем выполняется обновление в expo1.csv
- p2_1,yes
.)
expo1.csv
после изменений:
102,GREAT,прилагательное,ENG,p1_0,нет,p2_1,да,p3,нет,4,да,p5_2,нет,p6,да....,su1,amb,su_09,нет
104,BHAAG,глагол,HIN,p1,нет,p2,нет,p3_7,amb,p4,нет,p5,нет,p6_9,да....,sg4_3,да,su119,amb
110,.........,su11_0,нет
Теперь, после того, как скрипт внес изменения, нам нужно проверить, правильно ли сделаны изменения, сравнив файлы impo1 и expo1. Вот где я застрял.
До сих пор я мог изолировать данные между запятыми в impo1.csv
отдельные переменные, используя awk
:
Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no
Теперь вопрос в том, как мне это проверить? impo1.csv
Файлы содержат около 3000 обновлений. Если я grep p1 expo1.csv|grep no expo1.csv
, очевидно, что он не вернет правильный результат, так как в файле много строк 'no'. Я пробовал использовать цикл for для разделения данных с помощью awk
отдельных переменных, а затем grep с использованием подстановочного знака - grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv
-, но это не работает.
Использую GNU bash 4.1.2.
EDIT - Следовало упомянуть об этом раньше, моя ошибка - в файле impo1.csv нет четких шаблонов, которые я мог бы использовать для проверки файла expo1. Я внес исправления в содержимое файла-образца, которые иллюстрируют мою точку зрения.
решение1
Решение довольно простое. Вам просто нужно создать шаблон из каждой строки, impo1.csv
а затем grep
после expo1.csv
обновления
validate() {
# $1 ~ impo1.csv
# $2 ~ expo1.csv after changes
while read pattern; do
grep -q "^$pattern" $2 || return 1
done < <(sed "s/,/,.*/" $1 )
}
решение2
awk -F, '
NR==FNR{
for(i=1;i<NF;i)
DATA[$1 SUBSEP $++i] = $++i;
next
}
DATA[$1 SUBSEP $2] != $3
' expo1.csv impo1.csv
выведет строки, в impo1.csv
которых данные отличаются от данных вexpo1.csv