【问题标题】:Remove rows based on values in a column根据列中的值删除行
【发布时间】:2019-07-06 18:13:44
【问题描述】:

我想删除我的 CSV 中的所有行,其中“所有者”列下的值为 Fishbowl 数字内容。

这是一个示例 CSV

ID,Name,Function,Media,Owner
415,Sam,Run,Footage,Production
213,Raj,Catch,Footage,Fishbowl Digital Content
214,Jack,Hold,Website,Salvage
256,Jason,Catch,Website,Fishbowl Digital Content

我试过了

awk -F , '$4 != "Fishbowl Digital Content" {print $0}' Test.csv >TestModified.csv

但我仍然看到“所有者”下的值是“鱼缸数字内容”的行

awk -F , '$4 != "Fishbowl Digital Content" {print $0}' Test.csv >TestModified.csv

以下是所需的结果:

ID,Name,Function,Media,Owner
415,Sam,Run,Footage,Production
214,Jack,Hold,Website,Salvage

【问题讨论】:

  • 如果算上,它是$5'th 字段。
  • @karakfa,这就是我添加通用解决方案的原因,我的解决方案在其中找出所有者所在的字段编号(可以是任何数字),然后它将检查条件:)跨度>
  • @Saiyam Vora,很高兴您展示了您为解决问题所做的努力。尝试使用 {} 将您的示例/命令也包装在代码标签中。也给它一个时间,当你的问题的答案很少时,然后尝试选择其中任何一个作为正确的答案,快乐学习

标签: csv awk


【解决方案1】:

我知道这不是 awk,但我发现 Miller 方式 (http://johnkerl.org/miller/doc/) 非常简单实用

mlr --csv filter -x '$Owner=="Fishbowl Digital Content"' inputFile.csv

【讨论】:

    【解决方案2】:

    第一种解决方案(使用硬编码字段值):您能否尝试以下操作。

    awk -F, 'FNR==1{print;next} $NF!="Fishbowl Digital Content"' Input_file
    

    第二个解决方案(没有硬编码字段值的通用解决方案):添加更多通用解决方案,它将检查哪个字段具有 Owner 值,然后它将跳过行。这意味着我们在这里不是Owner 列的硬编码值。

    awk -F, 'FNR==1{for(i=1;i<=NF;i++){if($i=="Owner"){val=i}};print;next}  $val!="Fishbowl Digital Content"' Input_file
    

    【讨论】:

    • @Saiyam Vora,如果这些解决方案对您有帮助,请告诉我?
    【解决方案3】:

    您也可以使用grep,以防您匹配第一列或最后一列。对于最后一列,这里是过滤器:

    grep -v ',"Fishbowl Digital Content"$' file
    

    如果可以有尾随空格,那么:

    grep -vE ',"Fishbowl Digital Content"[[:space:]]*$' file
    

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多