【问题标题】:Script to find valid and invalid records CSV file查找有效和无效记录 CSV 文件的脚本
【发布时间】:2019-03-16 07:52:37
【问题描述】:

我正在尝试根据列数分隔 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

请给点建议。

【问题讨论】:

  • 您为什么将^H 视为有效文件内容的一部分?
  • 因为这是 CSV 文件@Inian 的分隔符

标签: shell unix awk sed scripting


【解决方案1】:

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

【讨论】:

  • 嗨@RavinderSingh13,我试过上面的那个。一项观察是有效和无效文件中都缺少标头。我不是 FNR 的,请您帮忙,因为不同文件的列数可能会发生变化,我想确保,我理解该命令。
  • @user805,是的,如果列可能会有所不同,您可以更改条件,对于标题,让我现在修复它。
  • @user805,请您现在查看我编辑的解决方案并让我知道吗?
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多