【问题标题】:Bash: Remove line from CSV if conditions met, then remove line from CSV if condition is not metBash:如果条件满足则从 CSV 中删除行,如果条件不满足则从 CSV 中删除行
【发布时间】:2015-10-13 10:40:07
【问题描述】:

我希望你们都度过了愉快的一天。我有一个问题可以通过一些帮助来解决。我有两个 CSV 文件,它们都包含 250k 记录。一个看起来像这样:

ProductCode,StockLevel,Active
4101385360060,0,1
6019002320030,0,0
3328200078030,0,0
2411000347030,93,1

还有一个是这样的:

ProductURL,Product Code,Product Name,More Fields
"http://www.domain.com",4101385360060,Timberland 6 In Buck Boot WHEAT NUBUCK

我想要对第一个文件做的是删除所有不需要这些条件的记录:

<All ok>,<!=0>,<=1>

然后使用第二个文件删除第一个文件中NOT 的所有行。

任何帮助 - 非常感谢。我怀疑awk 是我的朋友。

干杯,

马特。

【问题讨论】:

  • (感谢 A.M.D 的编辑 - 我应该如何配置帖子?)
  • 选择文本,
  • 嗨,请注意 processing 标记用于语言 processing.org - 已删除。
  • @anubhava,我的意思是在那部分任何值都可以。谢谢
  • 检查我的更新答案

标签: bash csv text awk


【解决方案1】:

你可以使用这个 awk 命令:

awk -F, 'FNR==NR && $2!=0 && $3==1{a[$1]; next} $1 in a' file1.csv file2.csv

但是我建议您在问题中提供更多具有预期输出的示例数据。

【讨论】:

    【解决方案2】:

    听起来这就是你想要的:

    $ cat tst.awk
    BEGIN { FS="," }
    FNR==1 { out=FILENAME"_out"; valid[$1] }
    NR==FNR && ($2!=0) && ($3==1) { valid[$1] }
    $1 in valid { print > out }
    
    $ awk -f tst.awk file1 file2
    
    $ cat file1_out
    ProductCode,StockLevel,Active
    2411000347030,93,1
    
    $ cat file2_out
    Product Code,Product Name
    

    如果没有,请编辑您的问题以阐明您的要求并提供更具代表性的示例输入和相关的预期输出。

    【讨论】:

      【解决方案3】:

      OP 评论说 id 不是第二个文件的第一部分,因此一种方法可能是:

      awk -F\, 'NR>1&&$2&&$3==1' file1 |tee -a file1_filtered |while IFS=, read -r id dummy; do 
         echo ",$id,"
      done > pattern_file
      grep -f pattern_file file2 >file2_filtered
      

      【讨论】:

      • 嘿 Klashxx,这太棒了。它让我得到一个格式正确的“file1_filtered”文件,但 file2_filtered 是空的。这可能是因为 file2 本身实际上包含多个列并再次查看它,我们匹配的 ID 不是第一个组件。这是来自 file2 的实际代码行:
      • 产品网址,产品代码,产品名称,产品款式代码,产品颜色代码,产品颜色,产品尺寸代码,产品尺寸英国,产品尺寸欧盟,产品现价,产品全价,产品价格类型,产品成本价格,产品利润,产品图片1,产品图片2,产品图片3,产品品牌,产品"domain.com/view/product/office_catalog/1,41/410131853600
      • @MattRogers 任何时候你在 shell 中编写一个循环只是为了操作文本你有错误的方法(谷歌它和/或查看例如unix.stackexchange.com/q/169716 上关于该主题的一个讨论)并且你永远不需要grep 当您已经在使用 awk 时,因为 awk 可以做 grep 可以做的任何有用的事情。如果您编辑问题以在给定示例输入的情况下显示预期输出,我们可以帮助您编写一个简短的 awk 脚本来执行您想要执行的任何操作。并且不要只在您的示例中提供 1 行 file2 - 提供应该保留和删除的行。
      • 太棒了——我已经让这段代码工作了!感谢大家的帮助。
      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2023-01-19
      • 2019-11-23
      • 2023-02-15
      相关资源
      最近更新 更多