Bash, awk, сравните 2 столбца, разделенные на, и поля в

Система

Linux local 5.0.0-27-lowlatency #28-Ubuntu SMP PREEMPT Tue Aug 20 20:33:37 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Вопрос

Как можно сравнить два столбца, разделенных на ,, и поля в ", когда , присутствует в поле (классический CSV с ").

Входной файл.

Titulka,231096,Spárovka borová 18 x 200 x 600 mm,https://eshop.unihobby.cz/stavba-drevo-a-wpc-sparovky-sparovka-borova-18x200x600mm/144020p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/231096-sp-rovka-borov-1-pou-t-tuto.jpg,42,45
Titulka,345602,"Lak Aquafin Plus čirý lesklý 0,6 kg",https://eshop.unihobby.cz/bydleni-barvy-a-laky-laky-a-lazury-lak-aquafin-plus-ciry-leskly-0-6-kg/153252p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/345602-aquafin-plus-plechovka.jpg,179,199
Titulka,345588,"Lak Movi Pur OSB čirý lesklý 0,6 kg",https://eshop.unihobby.cz/bydleni-barvy-a-laky-laky-a-lazury-lak-movi-pur-osb-ciry-leskly-0-6-kg/150470p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/345588.jpg,209,229
Titulka,213993,Schodnice masiv 300x1000x40 mm - smrk,https://eshop.unihobby.cz/stavba-schodiste-a-zabradli-schodnice-schodnice-masiv-300x1000x40-mm-smrk/138451p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/213993-schodnice-masiv-300x1000x40-smrk.jpg,299,329
2,233292,Střešní okno plastové kyvné Klasik NK E1 - 55 x 78 cm,https://eshop.unihobby.cz/stavba-okna-stresni-okna-stresni-okno-plastove-kyvne-klasik-nk-e1-55-x-78-cm/144206p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/233292-2-.jpg,3990,3990
2,234185,Střešní okno dřevěné kyvné Klasik MNK S1 - 55 x 78 cm,https://eshop.unihobby.cz/stavba-okna-stresni-okna-stresni-okna-stresni-okno-drevene-kyvne-klasik-mnk-s1-55-x-78-cm/144478p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/233288-3--4.jpg,2990,2990

...

Ожидаемый выходной файл (сравните $6 и $7, напишите $7, когда $6 != $7).

Titulka,231096,Spárovka borová 18 x 200 x 600 mm,https://eshop.unihobby.cz/stavba-drevo-a-wpc-sparovky-sparovka-borova-18x200x600mm/144020p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/231096-sp-rovka-borov-1-pou-t-tuto.jpg,42,45
Titulka,345602,"Lak Aquafin Plus čirý lesklý 0,6 kg",https://eshop.unihobby.cz/bydleni-barvy-a-laky-laky-a-lazury-lak-aquafin-plus-ciry-leskly-0-6-kg/153252p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/345602-aquafin-plus-plechovka.jpg,179,199
Titulka,345588,"Lak Movi Pur OSB čirý lesklý 0,6 kg",https://eshop.unihobby.cz/bydleni-barvy-a-laky-laky-a-lazury-lak-movi-pur-osb-ciry-leskly-0-6-kg/150470p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/345588.jpg,209,229
Titulka,213993,Schodnice masiv 300x1000x40 mm - smrk,https://eshop.unihobby.cz/stavba-schodiste-a-zabradli-schodnice-schodnice-masiv-300x1000x40-mm-smrk/138451p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/213993-schodnice-masiv-300x1000x40-smrk.jpg,299,329
2,233292,Střešní okno plastové kyvné Klasik NK E1 - 55 x 78 cm,https://eshop.unihobby.cz/stavba-okna-stresni-okna-stresni-okno-plastove-kyvne-klasik-nk-e1-55-x-78-cm/144206p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/233292-2-.jpg,3990 /* here is $6 = $7, so no output for $7 */
2,234185,Střešní okno dřevěné kyvné Klasik MNK S1 - 55 x 78 cm,https://eshop.unihobby.cz/stavba-okna-stresni-okna-stresni-okna-stresni-okno-drevene-kyvne-klasik-mnk-s1-55-x-78-cm/144478p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/233288-3--4.jpg,2990 /* here is $6 = $7, so no output for $7 */

...

Я пытался

awk -F ',' '{ if ($6 != $7) print $7; }' FILE

Возвращает неверные значения и возвращает только поле $7.

Спасибо.

1
задан 11 September 2019 в 10:39

1 ответ

Если у Вас есть CSV с commans в полях, awk не лучшее решение.
Для Вашего файла в качестве примера Вы могли все еще использовать его, потому что Вы можете просто сравнить последние два поля и не заботитесь о том, что там прежде:

awk '
BEGIN{FS=OFS=","}
$NF==$(NF-1){$NF=""}1
' file

Но в целом, это лучше проанализировало бы CSV с надлежащим синтаксическим анализатором CSV, например. csvkit:

csvsql -H --query '
    SELECT a,b,c,d,e,f, case g when f then NULL else g END g from file
' file | tail -n+2

(Я добавил tail -n+2 подавить строку заголовка)


Обратите внимание, что оба решения сохранят общее количество полей, просто освободив последнее поле. Для удаления последней запятой добавить | sed 's/,$//'.

1
ответ дан 7 December 2019 в 14:58

Другие вопросы по тегам:

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