嗨,朋友们晚上好,我是 awk 的初学者,所以我请求你帮助我,我想在文本文件中打印记录总数(行)。为此,我使用“打印 NR”命令。当我使用这个时BEGIN 块上的命令它打印记录数而不是打印总数。但是当我们在 END 块中使用它时,它会返回记录总数。例如,我有一个包含 5 列的文本文件,我尝试过这样 BEGIN { print NR } 它返回 1 2 3 4 5
我想从 BEGIN 块本身打印记录总数(行),所以请给我答案。
嗨,朋友们晚上好,我是 awk 的初学者,所以我请求你帮助我,我想在文本文件中打印记录总数(行)。为此,我使用“打印 NR”命令。当我使用这个时BEGIN 块上的命令它打印记录数而不是打印总数。但是当我们在 END 块中使用它时,它会返回记录总数。例如,我有一个包含 5 列的文本文件,我尝试过这样 BEGIN { print NR } 它返回 1 2 3 4 5
我想从 BEGIN 块本身打印记录总数(行),所以请给我答案。
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
BEGIN
块将在逐行开始文件处理之前执行。因此您无法获得BEGIN
块中的总记录。
它必须以某种奇怪的方式完成,如下所示:
awk 'BEGIN{"wc -l "FILENAME|getline result;print result}' your_file
这里上面的字面意思是 awk 什么都不做。它实际上是在做大部分事情的外壳。
您需要传递一个变量才能访问块中的记录/行数BEGIN
,因为该BEGIN
块是在处理文件之前执行的:
awk -v count="$(wc -l < file.txt)" 'BEGIN { print count }' file.txt