我有一个巨大的 csv 文件(2.77 亿行)。 我想验证哪些字段是主键。我的想法是做这样的事情:
awk 'BEGIN{FS=OFS=";"} {print $2,$3,$4,$5}' namefile.csv | sort | uniq | wc -l
如果我得到的数字与“
wc -l namefile.csv
”相同,则表示该密钥是唯一的。
问题是这会花费很多时间! 有没有办法在详细说明 500 万行时在屏幕上打印一些内容(但不打印到管道中!)?
编写日志文件的想法可能就是答案......
awk 'BEGIN{FS=OFS=";"} {print $2,$3,$4,$5; {if (NR % 5000000 == 0){print strftime("%Y-%m-%d %H:%M:%S"),NR/1000000 > "log.txt"}}}' namefile.csv | sort | uniq | wc -l
...但是这样做我只能在执行结束时看到日志文件。我希望即使在执行过程中也能看到它。
我能做什么?
由于您显然只想知道 CSV 文件中是否有重复项,因此可以使用
sort
、awk
和 tee
(不需要 uniq
、wc
和比较):
sort namefile.csv | awk '
NR>1 && $0 == p {print "dupes"; exit}
{p = $0}
(NR % 5000000) == 0 {print strftime("%Y-%m-%d %H:%M:%S"), NR/1000000}' |
tee -a log.txt
这将在第一个重复项上退出,并显示一条简单的
dupe
消息。否则,它将一直运行到文件末尾,并每 5000000 条记录打印您的进度消息。 tee
复制标准输出,将一个发送到标准输出并将另一个附加 (-a
) 到 log.txt
。