-2

嗨,朋友们晚上好,我是 awk 的初学者,所以我请求你帮助我,我想在文本文件中打印记录总数(行)。为此,我使用“打印 NR”命令。当我使用这个时BEGIN 块上的命令它打印记录数而不是打印总数。但是当我们在 END 块中使用它时,它会返回记录总数。例如,我有一个包含 5 列的文本文件,我尝试过这样 BEGIN { print NR } 它返回 1 2 3 4 5

我想从 BEGIN 块本身打印记录总数(行),所以请给我答案。

4

3 回答 3

2

NR 在读取文件时填充/递增,BEGIN 在打开任何文件之前执行,因此您具体要求的内容无法完成。

一种解决方法是:

awk 'BEGIN{ while ( (getline var < ARGV[1] > 0) ) nr++; print nr }' file

但在 UNIX 上,如果您的记录是换行符分隔的,则有更简单的方法,例如:

awk -v nr="$(wc -l < file)" 'BEGIN{ print nr }' file

也只是在 awk 你可能会得到你想要使用的输出:

awk 'NR!=FNR && FNR==1 { print NR - FNR }' file file
于 2012-11-05T12:25:52.903 回答
1

BEGIN块将在逐行开始文件处理之前执行。因此您无法获得BEGIN块中的总记录。

它必须以某种奇怪的方式完成,如下所示:

awk 'BEGIN{"wc -l "FILENAME|getline result;print result}' your_file

这里上面的字面意思是 awk 什么都不做。它实际上是在做大部分事情的外壳。

于 2012-11-05T12:19:16.873 回答
1

您需要传递一个变量才能访问块中的记录/行数BEGIN,因为该BEGIN块是在处理文件之前执行的:

awk -v count="$(wc -l < file.txt)" 'BEGIN { print count }' file.txt
于 2012-11-05T12:20:34.703 回答