代码之家  ›  专栏  ›  技术社区  ›  data_addict

用于查找CSV文件中有效和无效记录的脚本

  •  1
  • data_addict  · 技术社区  · 6 年前

    我试图根据列数来区分CSV文件中的有效记录和无效记录。 我看了下面的问题,似乎也在做同样的事情。

    Delete row which has more than X columns in a csv

    awk -v FS="\b" 'NF==3' sample.csv >> output.csv
    awk -v FS="\\^H" 'NF==3' sample.csv >> output.csv
    awk -v FS="\\cH" 'NF==3' sample.csv >> output.csv
    awk -v FS="^H" 'NF==3' sample.csv >> output.csv
    

    但是,^H分隔符不起作用。

    Sample.csv
    
    timestamp,header2,header3
    1^H1val2^H1val3
    2^H2val2^H2val3
    3^H4^H4val2^H4val3
    5^H5val2^H5val3
    6^H6val2^H6val3
    
    
    Valid.csv
    
    timestamp,header2,header3
    1^H1val2^H1val3
    2^H2val2^H2val3
    5^H5val2^H5val3
    6^H6val2^H6val3
    
    
    Invalid.csv
    
    timestamp,header2,header3
    3^H4^H4val2^H4val3
    

    1 回复  |  直到 6 年前
        1
  •  3
  •   RavinderSingh13 Nikita Bakshi    6 年前

    你能试试下面的吗。它基本上是寻找2个条件,第一个是检查字段的数量是否为3,然后将输出放入 Valid.csv Invalid.csv 输出文件。

    awk -F'\\^H' 'NF==3 && FNR>1{print > "Valid.csv"} NF>3 && FNR>1{print > "Invalid.csv"} FNR==1{print $0 > "Valid.csv";print $0 > "Invalid.csv"}' sample.csv
    

    现在也加入了非线性形式的解。

    awk -F'\\^H' '
    NF==3 && FNR>1{
      print > "Valid.csv"
    }
    NF>3 && FNR>1{
      print > "Invalid.csv"
    }
    FNR==1{
      print $0 > "Valid.csv"
      print $0 > "Invalid.csv"
    }' sample.csv