【发布时间】:2019-03-19 17:50:07
【问题描述】:
我正在尝试找到一种方法来计算在解析来自数百万个小文件的传入数据时已处理的行数。
以样本数据为例,tab 是分隔符:
CLIENT1.test.com /var DIR 21213412 user1 root default 2000-03-04 18:30:59.000000 PROC_MGMT
CLIENT1.test.com /usr DIR 212112 user1 root default 2006-02-11 08:30:00.000000 PROC_MGMT
CLIENT2.test.com /var/tmp/test.txt ACTIVE FILE 4000 sysuser sysuser NA 2001-04-11 03:00:09.000000 DEFAULT
CLIENT3.test.com /test.out PASSIVE FILE 4000 atuser atgroup group 2012-05-04 02:30:59.000000 AUTOMAT
CLIENT4.test.com /opt DIR 542016 dbuser dbgroup Default 2000-03-04 18:30:59.000000 SYSTEM
我的代码目前看起来像这样:
PATTERN="mssg1|mssg2|mssg3|...|mssgN"
SERVER=my_server_name
find <path> -type f -name "*.txt" -print0 | \
xargs -0 awk -v PAT="$PATTERN" '$0!~PAT' | \
awk '{gsub(/\t/",") {print}}' | \
awk -v SRV="$SERVER" 'BEGIN {FS=OFS=","} {$1=SRV OFS $1;} {if ($4 !~ /DIR/) $4=","$4;} {print}' | \
awk 'BEGIN {FS=OFS=","} {if ($9 == "") $9="01/01/1970 00:00:00 AM"; else {gsub("[:-]"," ",$9); $9=strftime("%m/%d%/Y %r", maketime($9))};} {print}' > /tmp/outputFile.log
我可以通过运行for 循环和wc -l(我猜这会很慢)来计算所有传入文件的总行数,并将其作为yyyy 行数。
我正在寻找的是计算我已经处理的行数。这样我就可以显示类似
echo "Processed xxxx lines out of yyyy lines"
其中 xxxx 可以被 1000 整除。例如:
Processed 1000 lines out of 1000000 lines.
Processed 2000 lines out of 1000000 lines.
Processed 3000 lines out of 1000000 lines.
.........
Processed 1000000 lines out of 1000000 lines.
Done.
我可以在我正在使用的awk 语句中添加一个计数器吗?
我的代码是基于RHEL 6.7 运行的bash。
【问题讨论】:
-
awk已经有一个名为NR的计数器,它代表记录的编号(索引)。在一般情况下,一条记录将是一条线;或者在你的情况下,一个空终止的记录。只需在 google 上搜索 awk+NR,您就会找到一些示例。 -
@Marcos,能否请您在代码标签中的帖子中发布示例输入和预期示例输出,然后让我们知道。
-
显示您的实际 Awk 命令可能使我们能够将整个流程重构为仅一两个 Awk 脚本。
-
你的意思是什么
-
您的输入数据在哪里?没有它,很难推断出你想要做什么。例如,
{if ($4 !~ /DIR/) $6=","$6;}到底是什么?您要插入一列吗?另外,我不会帮助您创建非 ISO8601 的日期。