AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1178129
Accepted
genderbee
genderbee
Asked: 2019-10-03 04:42:13 +0800 CST2019-10-03 04:42:13 +0800 CST 2019-10-03 04:42:13 +0800 CST

比较 2 列;当 1st col > 2nd col 时,删除 2nd col

  • 772

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

我做了类似的事情,比较 2 列,当相等时,删除第 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 个 cols 除以,(就在最后一行是 2nd value > 1st value 149 < 159,所以留下它,否则删除最后一个 col)。

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 中的引用不是,我该怎么做|?

bash sed text-processing awk csv
  • 2 2 个回答
  • 117 Views

2 个回答

  • Voted
  1. Best Answer
    steeldriver
    2019-10-04T10:17:47+08:002019-10-04T10:17:47+08:00

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

    一种选择是 perl 的Text::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_spaceex. 来配置它:

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

    要使 perl 支持 unicode,您可能需要添加-CSDL. 您可以轻松更改它以比较其他列。splice @f,4 if $f[4] <= $f[3](记住,在 perl 中,数组是零索引的)。


    我有一种感觉,通过有条件地使用miller应该更简单,put但是unset $[NF]我无法使其正常工作。

    • 1
  2. aborruso
    2019-10-05T01:18:23+08:002019-10-05T01:18:23+08:00

    使用 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 列,可以使用要比较的列号修改命令。

    • 1

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve