【问题标题】:Bash/Shell : CSV File Processing IssueBash/Shell:CSV 文件处理问题
【发布时间】:2016-07-11 05:03:36
【问题描述】:

我写了一个bash 脚本,它调用Python 脚本来扫描漏洞:

#scan.sh
while IFS=, read -r n d ;do
   python scan.py $d 443 | sed "s/^\(.\)/$n,\1/"
done < Input.csv

Input.csv 看起来像:

#Input.csv
1,abc.com
2,xyz.com
3,pqr.com
.........

Output.csv 应该是这样的:

1,abc.com,True,2016-03-06
1,abc.com,False,2016-03-06
1,abc.com,True,2016-03-06
1,abc.com,True,2016-03-06
2,xyz.com,False,2016-03-06
2,xyz.com,False,2016-03-06
2,xyz.com,False,2016-03-06
2,xyz.com,False,2016-03-06
3,pqr.com,True,2016-03-06
3,pqr.com,True,2016-03-06
3,pqr.com,True,2016-03-06
3,pqr.com,True,2016-03-06
........................

每个IDoutput.csv 中都有四个条目,结果各不相同。

  1. 如果ID 的四个条目中的任何一个是True,它必须是True 并且需要有一个ID 的条目。
  2. 如果ID 的所有四个条目都是False,则它必须是False 并且只有一个条目。
  3. 如果ID 的所有四个条目都是True,则它必须是True 并且只有一个条目。

因此:

# processed_out.csv

1,abc.com,True,2016-03-06
2,xyz.com,False,2016-03-06
3,pqr.com,True,2016-03-06
........

我怎样才能仅通过使用 awk/sed 来实现这种情况?

仅供参考:我是 bash 脚本的初学者。

【问题讨论】:

  • 有什么理由要在 bash 中执行此操作?你已经有了一个 python 脚本来完成“重要”的工作。首先让该脚本以您想要的格式吐出数据不是更容易吗?
  • @MarcB 我不想更改主脚本中的任何单行编辑,坦率地说,我对学习 bash 编程中的新东西更感兴趣;)
  • @MarcB 即使在 #scan.sh 脚本中,我也会将每个域的 ID ( sed "s/^(.)/$n,\1/" ) 插入/前缀到输出结果。我实际上爱上了 bash!

标签: bash shell csv awk sed


【解决方案1】:

使用 awk 非常简单:

awk -F, -v OFS=, '
    $3 == "True" {ntrue++} 
    NR%4 == 0 {
        $3 = (ntrue > 0) ? "True" : "False"
        print
        ntrue = 0
    }
' output.csv > processed_out.csv

【讨论】:

  • 谢谢!这是干净的方法
【解决方案2】:

awk 来救援!

$ pr -4ats, file | 
  awk -F, -v OFS=, '{for(i=3;i<=NF;i+=4) 
                        if($i=="True") {$3=$i; break}; 
                     print $1,$2,$3,$4}'

1,abc.com,True,2016-03-06
2,xyz.com,False,2016-03-06
3,pqr.com,True,2016-03-06

pr 将相关记录放在一起,用相应位置的任何“True”值覆盖状态。

【讨论】:

  • 不错。 pr 的替代品是 paste -d, - - - - &lt; file
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多