Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash/Shell:CSV文件处理问题_Bash_Shell_Csv_Awk_Sed - Fatal编程技术网

Bash/Shell:CSV文件处理问题

Bash/Shell:CSV文件处理问题,bash,shell,csv,awk,sed,Bash,Shell,Csv,Awk,Sed,我编写了一个bash脚本,该脚本调用Python脚本来扫描漏洞: #scan.sh while IFS=, read -r n d ;do python scan.py $d 443 | sed "s/^\(.\)/$n,\1/" done < Input.csv 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,Tru

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

#scan.sh
while IFS=, read -r n d ;do
   python scan.py $d 443 | sed "s/^\(.\)/$n,\1/"
done < Input.csv
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
........................
每个
ID
将在
output.csv
中有四个条目,结果各不相同

  • 如果
    ID
    的四个条目中的任何一个是
    True
    ,则它必须是
    True
    ,并且需要有一个
    ID
    条目
  • 如果
    ID
    的所有四个条目都是
    False
    ,则它必须是
    False
    ,并且只有一个条目
  • 如果
    ID
    的所有四个条目都是
    True
    ,则它必须是
    True
    ,并且只有一个条目
  • 因此:

    如何仅通过使用awk/sed实现这种情况


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

    awk非常简单:

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

    awk非常简单:

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

    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-4ats,文件|
    
    awk-F,-v of s=,{代表(i=3;i
    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-4ats,文件|
    
    awk-F,-v of s=,{for(i=3;i)为什么要在bash中执行此操作?您已经有了一个python脚本来执行“重要”操作工作。首先让脚本以您想要的格式输出数据不是更容易吗?@MarcB我不想更改主脚本中的任何单行编辑,坦率地说,我更感兴趣的是学习bash编程的新知识;)@MarcB即使在#scan.sh脚本中,我也在插入/前缀每个域的ID(sed“s/^(../$n,\1/”)转换为输出结果。事实上,我很喜欢bash!有什么理由要在bash中执行此操作吗?您已经有了一个python脚本来执行“重要”操作工作。首先让脚本以您想要的格式输出数据不是更容易吗?@MarcB我不想更改主脚本中的任何单行编辑,坦率地说,我更感兴趣的是学习bash编程的新知识;)@MarcB即使在#scan.sh脚本中,我也在插入/前缀每个域的ID(sed“s/^(../$n,\1/”)到输出结果。我实际上爱上了bash!谢谢!这是干净的方法谢谢!这是干净的方法尼斯。一种替代
    pr
    的方法是
    paste-d,--
    尼斯。另一种替代
    pr
    的方法是
    paste-d,--