如何使用 AWK 打印某些内容而不将其放入管道

问题描述 投票:0回答:1

我有一个巨大的 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

...但是这样做我只能在执行结束时看到日志文件。我希望即使在执行过程中也能看到它。

我能做什么?

awk printing pipeline
1个回答
0
投票

由于您显然只想知道 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

© www.soinside.com 2019 - 2024. All rights reserved.