📅  最后修改于: 2023-12-03 15:29:32.636000             🧑  作者: Mango
在Shell/bash中,awk是一个非常强大的文本处理工具。通过使用不同的选项和参数,可以实现对文本文件的各种操作。其中一个很有用的特性是可以指定分隔符。在默认情况下,awk使用空格作为分隔符,但是我们可以通过-F
(或--field-separator
)选项来指定自定义分隔符。本文将介绍如何使用awk分隔符逗号。
awk -F[,] 'BEGIN{...} pattern{...} END{...}' file
在上面的语法中:
-F[,]
选项指定了分隔符为逗号。其中[,]
是一种简写方式,表示逗号或空格或制表符。BEGIN{...}
语句块在处理文件前执行,可用于初始化变量或打印标题等操作。pattern{...}
语句块是awk的核心部分,它定义了如何处理文件的每一条记录。可以使用正则表达式等语法来匹配记录,然后在花括号内编写处理逻辑,常见的操作包括打印符合条件的记录或进行计数等。END{...}
语句块在处理文件后执行,可用于输出统计结果或打印尾部信息等操作。file
指定了要处理的文件,也可以把文件的内容作为标准输入(stdin)传入。假设有一个csv文件data.csv
,内容如下:
name,age,score
Tom,20,80
John,19,75
Amy,22,85
要计算每个人的总分数,可以使用以下的awk命令:
awk -F[,] 'BEGIN{sum=0}{sum+=int($3)}END{print "Total score: "sum}' data.csv
其中:
-F[,]
选项指定逗号为分隔符。BEGIN{sum=0}
语句块初始化一个变量sum
,并赋值为0。{sum+=int($3)}
逐行读取csv文件,累加第三列的整数值到sum
变量中。$3
表示第三个字段,int
函数把字符串转换为整数。注意,逗号后面可以有空格,但是建议不要有空格,以免出现问题。END{print "Total score: "sum}
在处理文件后输出Total score:
和sum
变量的值。输出结果为:
Total score: 240
假设有多个csv文件data1.csv
、data2.csv
、data3.csv
,每个文件都只包含两个字段:姓名和成绩,用逗号分隔。现在要把它们合并为一个大文件all_data.csv
,每行的格式是:姓名、成绩、来源文件名。
可以使用以下的awk命令:
awk -F[,] '{print $1","$2,FILENAME}' data*.csv > all_data.csv
其中:
-F[,]
选项指定逗号为分隔符。{print $1","$2,FILENAME}
逐行读取多个csv文件,打印每行的第一列、第二列和来源文件名,以逗号分隔。$1
和$2
分别表示第一个和第二个字段,FILENAME
表示当前处理的文件名。data*.csv
表示将多个文件名以通配符形式传入。输出结果为:
Tom,80,data1.csv
John,75,data1.csv
Mary,85,data2.csv
...
awk是一款功能强大的文本处理工具,支持各种分隔符和正则表达式等高级语法。在处理csv或其他结构化数据时,可以使用-F
选项指定分隔符,然后通过花括号内的逻辑进行处理。熟练掌握awk的用法可以让我们更高效地完成日常工作。