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

时间:2018-10-11 09:21:23

标签: shell unix awk sed scripting

我正在尝试基于许多列来分隔CSV文件中的有效和无效记录。 我经历了下面的SO问题,似乎也在做同样的事情。

Delete row which has more than X columns in a csv

但是对于我的情况,定界符是^ H,因此请尝试以下方法。

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定界符没有任何作用。

此外,在上一个SO问题中,他们正在捕获有效记录(以输出),我想将无效记录都捕获到两个不同的文件中。

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 个答案:

答案 0 :(得分:2)

能否请您尝试以下。基本上是在寻找2个条件,第一个是检查字段数是否为3,然后将输出放置到Valid.csv中,如果字段数大于3,然后将输出放置到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