Linux / AIX- Unix中使用bash / ksh在巨大的CSV文件的特定列和行号中获取非数字值的最快方法是什么。
假设我有以下格式的数据,
1,AAA,486254452,1F
2,BAF,265363,6A
3,AFHGJ, ,3G
...
50000,GAJGFGS,.,5H
...
100000,GHFHFFS,47,6L
考虑到CSV中的行数可以轻松为100,000,这是识别第3列中具有非数字值的行号的最快方法。非数字必须包含 - space,'。'。
我尝试了一个shell脚本并循环遍历文件的每一行,但这需要花费很多时间。
line=0
while read lineOfCSV
3rdCol=`echo $lineOfCSV | cut -d ',' -f3`
line=`expr $line +1`
if ! [[ $3rdCol=~ '^[0-9]+$' ]] ; then
echo "Line = :$line: NON-NUMERIC VALUE :$3rdCol:"
fi
done < data.csv
我为上面的代码运行了80000行的CSV文件,处理时间超过10分钟。所以我停止了脚本并搜索了更快的解决方案。我找不到具体的东西。所以我在这里发布了这个问题。
答案 0 :(得分:5)
awk 'BEGIN{FS=","} $3 ~ /[^[:digit:]]/{print NR}' file
应该这样做。
作为旁注,这也将为第三栏中的标点符号和空格树立。
答案 1 :(得分:3)
Perl对于这类任务通常非常快:
perl -F, -ane '$F[2] =~ /\D/ and print "$.\n"' file