比较两列;当第一列 > 第二列时,删除第二列

比较两列;当第一列 > 第二列时,删除第二列

如何比较 csv 文件中的 2 个列,除以,并且当在生成的列中存在时,,列包含引号,并且当第 2 个列 > 第 1 个列时,则删除第 2 个(最后一个)列。",

我做了类似的事情,比较两列,当它们相等时,删除第二列(最后一列)。

awk ' BEGIN{FS=OFS=","} $NF==$(NF-1){$NF=""}1 ' input_file.csv | sed 's/,$//'

文件input_file.csv

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790,2790
8,465435,Plechový talíř - Autumn,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69,39
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

所需输出,使用最后 2 个列除以,(最后一行是第二个值 > 第一个值,149 < 159所以保留它,否则删除最后一个列)。

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790
8,465435,Plechový talíř - Autumn,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

是否可以不仅对最后一个 col 执行此操作,而且对行内某处的 col 执行此操作(删除)?

如果 csv 中的引用不是",我该怎么做呢|?例如?

答案1

如果您的文件可以包含带引号的嵌入分隔符,那么基于标准工具的任何东西(如sed或)awk都会很脆弱 - 最好使用专用的 CSV 解析库。

一个选项是 perl 的文本::CSV模块。例如,给定

$ cat file.csv
foo,bar,baz,559,559
foo,field with spaces,baz,559,559
foo,"field with embedded, quoted separators",baz,2790,2790
foo,bar,baz,69,39
foo,bar,baz,149,159

然后

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()}
  @f = $p->fields() if $p->parse($_) or die "Failed to parse CSV";
  $n = $#f;
  splice @f,-1 if $f[$n] <= $f[$n-1];
  $p->print(*STDOUT,\@f)
' file.csv
foo,bar,baz,559
foo,"field with spaces",baz,559
foo,"field with embedded, quoted separators",baz,2790
foo,bar,baz,69
foo,bar,baz,149,159

请注意,默认情况下,该print方法会引用包含空格以及包含分隔符的字段 - 您可以在实例化时通过设置来配置它,例如quote_space

  BEGIN{$p = Text::CSV->new({quote_space => 0})}

为了使 perl 能够识别 unicode,您可能需要添加-CSDL。您可以轻松将其更改为比较其他列,例如splice @f,4 if $f[4] <= $f[3](请记住,在 perl 中,数组是从零索引的)。


我觉得使用应该更简单磨坊主通过有条件地put输入,unset $[NF]但是我无法使其正常工作。

答案2

使用 Miller (https://github.com/johnkerl/miller), 从...开始

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790,2790
8,465435,"Plechový, talíř - Autumn",https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69,39
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

并运行

mlr --csv --implicit-csv-header --headerless-csv-output  put 'if ($6 >= $7) {unset $7 }' input.csv | sed -r '/^\s*$/d' >output.txt

你将会拥有

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790
8,465435,"Plechový, talíř - Autumn",https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

如果你的字段分隔符是|命令将是

mlr --csv --fs "|" --implicit-csv-header --headerless-csv-output  put 'if ($6 >= $7) {unset $7 }' input.csv | sed -r '/^\s*$/d' >output.txt

如果您不想比较第 6 列和第 7 列,则可以使用要比较的列号修改命令。

相关内容