从shell中的多个csv文件中读取

时间:2015-12-27 08:39:40

标签: bash shell unix awk

如何从具有成千上万行数据的多个CSV文件中读取数据并分别为每个文件计算数据并将其打印在一个csv文件中。这可能吗?

例如:

  1. 200个csv文件,每个文件包含5000多行数据
  2. 对于每个csv文件,我想使用一些条件并执行 基于那个的计算
  3. 最后我想要一个csv文件,其中包含单独列出的所有200个csv文件的计算。
  4. 2个CSV文件的示例

    example.csv

    Fname      Lname     ID    Online(Y/N)   URL           Address
    John       Doe       123   Y             xyz.com       NJ
    Jane       Doe       234   N             abc.com       CA
    Jane       Doe       234   Y             abc.com       CA
    

    ex.csv

    Fname      Lname     ID    Online(Y/N)   URL           Address
    John       Doe       123   Y             xyz.com       NJ
    Jane       Doe       234   N             abc.com       CA
    Jane       Doe       234   Y             abc.com       CA 
    Jane       Doe       234   Y             abc.com       CA
    

    用于计算的条件:

    • 从所有csv文件中读取并且输入文件具有“|”分开价值观。
    • 如果在线=是,如果网址= abc且地址= CA,则将其计为A或将其计为B
    • 以CSV格式打印结果

    Output.csv

    Filename     A    B
    example      1    2
    ex           2    2    
    

    这样做的最佳方式是什么?

    #!/bin/bash
    OUTFILE = 'finalcount.csv'
    
    CAT $1 | tr "," " " | tr -d '"' | tr -d "\t" | \  (Is this the best way to remove white space and , and etc from the input file?)
    
    awk -F"|" 'NR>1 {$4=="Y" && $5=="*abc.com" && $6=="CA" ? a++ : b++}
    
    END {print FILENAME,a,b}' *.csv 
    

    我应该对此代码进行哪些更改?

1 个答案:

答案 0 :(得分:1)

由于您还没有提供任何代码,我会为单个文件提供解决方案,也许您可​​以为多个输入文件处理它

$ awk 'NR>1 { $4=="Y" && $5=="abc.com" && $6=="CA" ? a++ : b++ } 
         END{print FILENAME, a, b}' ex.csv

ex.csv 2 2

对于实际的csv输入,您需要使用-F,选项将文件分隔符设置为逗号。跳过第一个标题行可以使用FNR完成(提示您也可以使用它来检测输入文件更改)