Bash,awk,将2个cols除以,然后比较“


1

系统

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

我该如何比较,字段中"何时,存在的两个cols除以和字段(带的经典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字段。

谢谢。


我无法很好地理解这个问题,请尝试awk -F',' '$6!=$7 {print $7}'告诉我它是否还可以,请给我一个答案
cmak.fr

@ cmak.fr嗨,谢谢,但是这是一样的。问题在于某些字段" field"作为一个字段在双引号中,但是对此却独立awk承担,。例如345588,"Lak Movi Pur OSB čirý lesklý 0,6 kg",,内部"",应该作为一个字段awk。但是请awk,。以及如何获得所有价值。简单地说,我只需要删除last值,如果该值与之前相同,例如last 2个字段...,12,12ar相同,那么only return ...,12...,12,14是不相同,所以return ...,12,14
sexbee

Answers:


1

如果您的CSV字段中带有逗号,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/,$//'


谢谢,一个非常简单的好解决方案,只是,在行尾,只有最后一个值$7被删除。,在这种情况下,我也该如何移除?而且我不能使用csvsql,因为我没有root用户权限来安装它。
sexbee

如果您阅读了完整的答案....
pLumo

对不起,谢谢 但是如果需要对行中间的字段执行此操作,awk的解决方案是使用双引号“”`解析行吗?谢谢。
sexbee

解决方案是让您的管理员安装适当的工具来完成您的工作。csvkit或一些python csv模块会很好。对此没有任何好处awksed解决方案。也许有些奇怪的易于出错的变通办法可以在某些情况下以某种方式起作用,但没有真正的解决方案。
pLumo

至少使用gawkmawk,您可以递减NF以删除最后一个字段,而无需留下尾随定界符
steeldriver
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.