首页 > 解决方案 > 查找有效和无效记录 CSV 文件的脚本

问题描述

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

删除csv中超过X列的行

但是,对于我的情况,分隔符是 ^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

请有任何建议。

标签: shellunixawksedscripting

解决方案


请您尝试以下操作。它基本上是在寻找 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

推荐阅读