awk积累(内置变量、指定分隔符、判断纯小数、数字相加)

本文详细介绍了awk命令中的内置变量,如ARGC、ARGV等,并通过实例展示了如何使用这些变量进行数据处理,包括判断列数及列内容类型、进行数值运算等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、awk内置变量

ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行 -F选项
NF浏览记录的域的个数
NR已读的记录数
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符

例如使用如下脚本判断一行数据中列的个数,及某列是否为小数:

cat t_doFind_fetch.txt | awk -F ' ' '{if(NF == 3 && ($3 ~ /^[0-9\.]+$/)){print $0}}' > t_doFind_fetch2.txt

二、判断某列是小数

echo "0.123" |awk '{if($0 ~ /^[0-9\.]+$/) print $0;}'

三、awk数字相加

1、整数相加
awk用数字和字母相加,不会报错,总和只是所有为数字的字段和,假设文本内容如下(以空格和tab分隔字段):

1       2       3
2       3 4
a b c

使用如下脚本:

cat test.txt | awk -F ' ' 'BEGIN{total=0;} {total+=$1} END{print total;}'

以上脚本的运行过程中并没有报错,并且运行结果为:3

2、科学计数法相加
awk脚本支持科学计数法相加,如下文本:

t_file_fetch =  1.00135803223e-05
t_file_fetch =  4.05311584473e-06
t_file_fetch =  3.09944152832e-06

使用脚本:

cat test.txt | awk -F ' ' 'BEGIN{total=0;} {total+=$3} END{print total;}'

运行结果:1.71661e-05

<think>首先,用户的问题是关于awk的BEGIN块,具体是如何使用它来设置字段分隔符(fieldseparator)。用户提到了示例和用法,所以我需要基于提供的引用来构建回答。回顾引用内容:-引用[1]:提到使用-F选项在命令行指定分隔符,如awk-F":"'{print$1}'。-引用[2]:展示了awk的基本语法,包括BEGIN和END块,如awk'BEGIN{print"begin"}{print$1,$2}'。-引用[3]:解释了内置变量如FS(字段分隔符),并指出在BEGIN块中设置FS以避免第一行问题,如awk'BEGIN{FS=":"}{print$1}'。-引用[4]:讨论了改变分隔符,使用BEGIN{OFS=":"}来设置输出分隔符。-引用[5]:确认了FS可以在文件中或命令行设置,并提到了BEGIN块。用户的核心需求是:如何在awk中使用BEGIN块来指定字段分隔符,包括示例和用法。我的回答需要结构化、清晰,并使用中文。系统级指令要求:-行内数学表达式用$...$(但这里没有数学内容,主要是文本)。-独立公式用$$...$$(同样不适用)。-LaTeX语法正确(这里不涉及复杂数学)。-使用中文回答。-生成相关问题。-在引用的段落末尾添引用标识,如[^1]。回答结构:1.**介绍BEGIN块**:解释BEGIN块的作用,即在处理输入前执行。2.**设置字段分隔符**:说明FS变量用于字段分隔符,强调在BEGIN块中设置的重要性。3.**示例用法**:提供代码示例展示如何使用BEGIN块设置分隔符。4.**解释示例**:详细说明每个部分。5.**常见问题**:比如为什么在BEGIN块中设置(避免第一行问题)。6.**总结**:简要回顾。最后,生成相关问题。基于引用,我可以直接引用或参考:-引用[3]明确指出:在BEGIN块中设置FS,因为默认分隔符是空格,如果不设置,第一行可能出错。-示例:awk'BEGIN{FS=":"}{print$1}'/etc/passwd现在,构建回答:-**开头**:直接回答用户问题。-**主体**:-解释BEGIN块。-解释FS变量。-给出示例。-解释为什么在BEGIN块中设置。-**结尾**:总结并生成相关问题。添引用标识:在引用内容时自然添。例如,提到“如果不设置BEGIN块,第一行可能使用默认分隔符”时,引用[^3]。相关问题:1.如何在awk中使用END块?2.如何设置输出分隔符(OFS)?3.awk中其他常用的内置变量有哪些?确保回答真实可靠。</think>### 在awk中使用BEGIN块设置字段分隔符的指南 awk是一种强大的文本处理工具,常用于数据提取和报告生成。字段分隔符(Field Separator, FS)用于定义如何分割输入行中的字段(列)。默认情况下,FS是空格或制表符,但可以通过`FS`变量自定义。使用BEGIN块设置FS可以确保在awk处理任何输入行之前就应用新分隔符,避免第一行因默认分隔符导致的错误(如引用[^3]所述)。下面我将逐步解释用法和示例。 #### 1. BEGIN块的作用 BEGIN块是awk的特殊模式,格式为`BEGIN { ... }`。它会在awk开始读取输入文件之前执行一次,通常用于初始化设置(如字段分隔符)。这与主处理块`{ ... }`(每行执行)和END块(处理结束后执行)区分开来。在BEGIN块中设置FS能保证所有行(包括第一行)都使用新分隔符处理(引用[^3])。 #### 2. 设置字段分隔符的基本语法 - **核心变量**:`FS`用于指定输入字段分隔符。 - **语法结构**: ```awk awk 'BEGIN { FS = "分隔符" } { 主处理命令 }' 文件名 ``` 其中: - `"分隔符"`可以是任意字符或正则表达式(如`":"`或`","`)。 - `{ 主处理命令 }`是awk对每行执行的操作,例如打印特定字段`print $1`。 - **为什么用BEGIN块**:如果不使用BEGIN块,FS可能在第一行处理后才生效,导致第一行按默认空格分割(引用[^3])。 #### 3. 完整示例 以下示例基于Linux系统中的`/etc/passwd`文件(该文件以冒号`:`分隔字段)。假设我们想打印每行的用户名(第1字段)和用户ID(第3字段)。 - **示例代码**: ```awk awk 'BEGIN { FS = ":" } { print $1, $3 }' /etc/passwd ``` - **解释**: - `BEGIN { FS = ":" }`:在处理前设置字段分隔符为冒号。 - `{ print $1, $3 }`:对每行打印第一个字段(用户名)和第三个字段(用户ID),字段间默认以空格分隔。 - 运行此命令会输出类似: ``` root 0 daemon 1 bin 2 ... ``` - **对比错误用法**:如果省略BEGIN块(如`awk '{FS=":"} {print $1}' /etc/passwd`),第一行可能仍使用默认空格分隔符,导致输出错误(引用[^3])。 #### 4. 高级用法和注意事项 - **正则表达式分隔符**:FS支持正则表达式。例如,设置分隔符为多个字符(如`FS = "[:,]"`表示以冒号或逗号分割)。 - **输出分隔符OFS**:BEGIN块也可设置输出字段分隔符(Output Field Separator, OFS),控制`print $1,$2`的字段间分隔。例如: ```awk awk 'BEGIN { FS = ":"; OFS = " - " } { print $1, $3 }' /etc/passwd ``` 输出:`root - 0`(引用[^4])。 - **命令行替代方案**:虽然BEGIN块更安全,但简单场景可用`-F`选项(如`awk -F":" '{print $1}'`),这在命令行中更快捷(引用[^1])。 - **常见错误**:在BEGIN块外设置FS(如`{FS=":"}`)可能导致第一行处理不一致,建议始终在BEGIN块中初始化FS(引用[^3])。 #### 5. 总结 在awk中使用BEGIN块设置字段分隔符(FS)是处理结构化文本(如CSV或配置文件)的最佳实践。它能确保分隔符从第一行开始生效,避免数据解析错误。核心步骤包括:在BEGIN块定义`FS`,然后在主块中操作字段(如`$1`, `$2`)。结合OFS可以进一步控制输出格式,提升数据处理灵活性(引用[^3][^4])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值