我正在尝试基于许多列来分隔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
请提出任何建议。
答案 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