用于模拟的awk脚本

用于模拟的awk脚本,awk,Awk,朋友们晚上好 我是awk的初学者,所以我请求你帮助我 我想打印文本文件中的记录总数(行)。为此,我使用“print NR”命令。当我在“开始”块上使用此命令时,它将打印记录数,而不是打印总数。但当我们在“结束”块中使用它时,它将返回记录总数。 例如,我有一个5列的文本文件,我试着这样做 开始{ 印刷品编号 }它回来了 1. 2. 3. 4. 五, 我想打印BEGIN块本身的记录(行)总数,请给我答案。BEGIN块将在开始逐行处理文件之前执行。 因此,无法在BEGIN块中获取总记录 必须以如下奇怪

朋友们晚上好 我是awk的初学者,所以我请求你帮助我 我想打印文本文件中的记录总数(行)。为此,我使用“print NR”命令。当我在“开始”块上使用此命令时,它将打印记录数,而不是打印总数。但当我们在“结束”块中使用它时,它将返回记录总数。 例如,我有一个5列的文本文件,我试着这样做 开始{ 印刷品编号 }它回来了 1. 2. 3. 4. 五,


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

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

必须以如下奇怪的方式完成:

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

在这里,上面的字面意思是awk什么也不做。实际上是shell在做大部分事情。

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

awk -v count="$(wc -l < file.txt)" 'BEGIN { print count }' file.txt
awk-v count=“$(wc-l
NR在读取文件时填充/增加,在打开任何文件之前执行BEGIN,因此无法完成您特别要求的操作

解决办法是:

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

上面将在输出中包含文件名,而不是让shell调用awk调用shell调用wc,最好是让shell调用wc,然后调用awk。还有一个疑问是,第二个示例中的-v是什么?如何使用awk程序过度写入文本文件例如,我有一个包含3列和3行的文本文件。现在我想在该文件中再添加一列。请告诉我此过程的awk脚本。ARGV是参数数组pass to awk所以ARGV[1]是第一个参数,它是文件名-v是用于在awk脚本运行之前将变量设置为值的选项。awk是一种用于解析文本文件的工具。shell是一种用于操作文件和进程的工具。因此,要更新一个文件,您可以同时使用:
awk'script'file>tmp和&mv-tmp file
awk -v nr="$(wc -l < file)" 'BEGIN{ print nr }' file
awk 'NR!=FNR && FNR==1 { print NR - FNR }' file file