awk教程「建议收藏」

awk教程「建议收藏」AWK介绍 0.awk有3个不同版本:awk、nawk和gawk,未作特别说明,一般指gawk。 1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。 2.三种方式调用awk 1)awk[opion]’awk_script’input_file1[input_file

大家好,又见面了,我是你们的朋友全栈君。

AWK介绍 
0.awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。 
1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。 

2.三种方式调用awk 
1) awk [opion] ‘awk_script’ input_file1 [input_file2 …] 
awk的常用选项option有; 
① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,wak使用环境变量IFS的值 
② -f filename : 从文件filename中读取awk_script 
③ -v var=value : 为awk_script设置变量 
2) 将awk_script放入脚本文件并以 #!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。 
3) 将所有的awk_script插入一个单独脚本文件,然后调用: awk -f wak脚本文件 input_file(s) 

3. awk的运行过程 
1) awk_script的组成: 
① awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔 
② awk_cmd由两部分组成: awk_pattern { actions } 
③ awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来。 
2) awk命令的一般形式: 
awk ‘ BEGIN { actions } 
awk_pattern1 { actions } 
………… 
awk_patternN { actions } 
END { actions } 
‘ inputfile 
其中 BEGIN { actions } 和 END { actions } 是可选的。 
3) awk的运行过程: 
① 如果BEGIN 区块存在,awk执行它指定的actions。 
② awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取) 
③ awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。 
④ 把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。 
⑤ 当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。 
⑥ 当awk读完所有的输入行后,如果存在END,就执行相应的actions。 

4) iput_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。 
5) 一条awk_cmd的awk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions。一条awk_cmd的actions 也可以省略,省略时默认的动作为打印当前输入记录(print $0) 。一条awk_cmd中的awk_pattern和actions不能同时省略。 
6) BEGIN区块和END区块别位于awk_script的开头和结尾。awk_script中只有END区块或者只有BEGIN区块是被允许的。如果awk_script中只有BEGIN { actions } ,awk不会读取input_file。 
7) awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。 
8) awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。 

4.awk_pattern 
awk_pattern模式部分决定actions动作部分何时触发及触发actions。awk_pattern可以是以下几种类型: 
1) 正则表达式用作awk_pattern: /regexp/ 
① awk中正则表达式匹配操作中经常用到的字符: 
\ ^ $ . [] | () * // 通用的regexp元字符 
+ : 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep或sed等 
? : 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep或sed等 
② 举例: 
awk ‘/ *\$0\.[0-9][0-9].*/’ input_file 
2) 布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。 
① 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/ 
② 布尔表达式中的操作符: 
关系操作符: < > <= >= == != 
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真 
value !~ /regexp/ 如果value不匹配/regexp/,则返回真 
举例: awk ‘$2 > 10 {print “ok”}’ input_file 
awk ‘$3 ~ /^d/ {print “ok”}’ input_file 
③ &&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。 
举例: awk ‘($1 < 10 ) && ($2 > 10) {print “ok”}’ input_file 
awk ‘/^d/ || /x$/ {print “ok”}’ input_file 
④ 其它表达式用作awk_script,如赋值表达式等 
eg: awk ‘(tot+=$6); END{print “total points :” tot }’ input_file // 分号不能省略 
awk ‘tot+=$6 {print $0} END{print “total points :” tot }’ input_file // 与上面等效 

5.actions 
actions就是对awk读取的记录数据进行的操作。actions由一条或多条语句或者命令组成,语句、命令之间用分号(;)分隔。actions中还可以使用流程控制结构的语句。 
1) awk的命令: 
① print 参数列表 : print可以打印字符串(加双引号)、变量和表达式,是awk最基本的命令。参数列表要用逗号(,)分隔,如果参数间用空格分隔,打印出时参数值之间不会有空格。 
② printf ([格式控制符],参数) : 格式化打印命令(函数),语法与C语言的printf函数类似。 
③ next : 强迫awk立刻停止处理当前的记录,而开始读取和处理下一条记录。 
④ nextfile : 强迫awk立刻停止处理当前的输入文件而处理输入文件列表中的下一个文件 
⑤ exit : 使awk停止执行而跳出。如果有END 存在,awk会去执行END 的actions。 

2) awk的语句: awk的语句主要是赋值语句,用来给变量赋值。 
① 把直接值或一个变量值赋值给变量。如果直接值是字符串要加双引号。 
举例: awk ‘BEGIN {x=1 ; y=3 ; x=y ; print “x=” x ” ; y=” y }’ 
② 把一个表达式的值赋值给变量。表达式一般是数值表达式,也可以是其它表达式。 
数值表达式: num1 operator num2 
operator可以是: +(加) -(减) *(乘) /(除) %(取模) ^(求幂) 
当num1或者num2是字符串而是不是数字时,无论是否加有双引号,awk都视其值为0 
条件选择表达式: A?B:C (A为布尔表达式,B和C可以是表达式或者直接值) 
当布尔表达式A的值为真时,整个表达式的值为B,A的值为假时,整个表达式的值为C 
举例: awk ‘BEGIN {x=3 ; x+=2 ; y=x+2 ; print “x=” x ” ; y=” y }’ 
awk ‘BEGIN {x=3 ; y=x>4?”ok”:4 ; print “x=” x ” ; y=” y }’ 
③ 为了方便书写,awk也支持C语言语法的赋值操作符: += -= *= /= %= ^= ++ — 

3) 流程控制结构 (基本上是使用C语言的语法) 
其中condition一般为布尔表达式,body和else-body是awk语句块。 
① if (condition) {then-body} [else {else-body}] 
② while (condition) {body} 
③ do {body} while (condition) 
④ for (initialization; condition; increment) {body} 
与C语言的for结构的语法相同。 
⑤ break : 跳出包含它的for、while、do-while 循环 
⑥ continue : 跳过for、while、do-while循环的body的剩余部分,而立刻进行下一次循环的执行。 

6.awk的变量 
在awk_script中的表达式中要经常使用变量。不要给变量加双引号,那样做,awk将视之为字符串。awk的变量基本可以分为两类: 
1) awk内部变量: awk的内部变量用于存储awk运行时的各种参数,这些内部变量又可以分为: 
① 自动内部变量: 这些变量的值会随着awk程序的运行而动态的变化,在awk_script中改变这些变量的值是没有意义的(即不应该被赋值)。常见的有: 
NF : 当前输入字段的字段数 
NR : 对当前输入文件而言,已经被awk读取过的记录(行)的数目。 
FNR : 已经被awk读取过的记录(行)的总数目。当输入文件只有一个时,FNR和NR是一致的。 
FILENAME : 当前输入文件的文件名。 
ARGC : 命令行参数个数。(不包括选项和awk_script,实际就是输入文件的数目加1) 
ARGIND : 当前被处理的文件在数组ARGV内的索引( 实际上ARGV[1]就是第一个输入文件 ) 
举例: awk ‘{print NR,NF,$0} END {print FILENAME}’ input_file 
② 字段变量($0 $1 $2 $3 …): 当awk把当前输入记录分段时,会对这些字段变量赋值。和内部变量类似,在awk运行过程中字段变量的值是动态变化的。不同的是,修改这些字段变量的值是有意义的,被修改的字段值可以反映到awk的输出中。 
可以创建新的输出字段,比如,当前输入记录被分割为8个字段,这时可以通过对变量 $9 (或$9之后的字段变量)赋值而增加输出字段,NR的值也将随之变化。 
字段变量支持变量名替换。 
举例: pwd |awk -F/ ‘{print $NF}’ // print $NF 打印输入记录的最后一个字段 
awk ‘{x=2;print $x}’ input_file // 打印输入记录的第2个字段 
③ 其它内部变量: 可以修改这些变量。常见的有: 
FS : 输入记录的字段分隔符(默认是空格和制表符) 
OFS : 输出记录的字段分隔符(默认是空格) 
OFMT : 数字的输出格式(默认是 %.6g) 
RS : 输入记录间的分隔符(默认是NEWLINE) 
ORS : 输出记录间的分隔符(默认是NEWLINE) 
ARGV : 命令行参数数组 
ENVIRON : 存储系统当前环境变量值的数组,它的每个成员的索引就是一个环境变量名,而对应的值就是相应环境变量的值。可以通过给ENVIRON数组的成员赋值而改变环境变量的值,但是新值只在awk_script内有效。eg: ENVIRON[“HISTSIZE”]=500 
举例: cat /etc/passwd | awk ‘BEGIN { FS=”:” } {print “User name: “$1,”UID: “$4}’ 

2) 自定义变量 
1) 定义变量: varname=value (自定义变量不需先声明后使用,赋值语句同时完成变量定义和初始化) 
2) 在表达式中出现不带双引号的字符串都被视为变量,如果之前未被赋值,默认值为0或空字符串。 
3) 向命令行awk程序传递变量的值: 
① Usage: awk ‘awk_script’ awkvar1=value1 awkvar2=value2 …. input_file 
eg: awk ‘{if ($5 < ARG) print $0 }’ ARG=100 input_file 
② awkvar可以是awk内置变量或自定义变量。 
③ awkvar的值将在awk开始对输入文件的第一条记录应用awk_script前传入。如果在awk_script中已经对某个变量赋值,那么在命令行上传人到该变量的值就会无效(实际上是awk_script中的赋值语句覆盖了从命令行上传入的值)。 
④ 在awk脚本程序中不能直接使用shell的变量。通过使用下面的语法可达到这样的效果。 
awk ‘awk_script’ awkvar1=shellvar1 awkvar2=shellvar2 …. input_file 
eg: awk ‘{if (v1 == “root”) {print “User name is root!”}}’ v1=$USER input_file 
⑤ 可以向awk脚本传递变量的值,与上面的类似。 
awk_script_file awkvar1=value1 awkvar2=value2 … input_file 

7.awk的内置函数 
可以在awk_script的任何地方使用awk函数。和awk变量一样,awk函数可以分为内置函数和自定义函数。 
1) 常见awk内置数值函数 
int(x) : 求出x 的整数部份,朝向0 的方向做舍去。eg: int(3.9)是3,int(-3.9) 是-3。 
sqrt(x) : 求出x 正的平方根值。eg: sqrt(4)=2 
exp(x) : 求出x 的次方。eg: exp(2) 即是求e*e 。 
log(x) : 求出x 的自然对数。 
sin(x) : 求出x 的sine 值,x 是弪度量。 
cos(x) : 求出x 的cosine 值,x 是弪度量。 
atan2(y,x) : 求y/x 的arctangent 值,所求出的值其单位是弪度量。 
rand() : 得到一个随机数(平均分布在0和1之间)。每次执行gawk,rand从相同的seed生成值。 
srand(x) : 设定产生随机数的seed为x。如果在第二次运行awk程序时你设定相同的seed值,你将再度得到相同序列的随机数。如果省略引数x,例如srand(),则当前日期时间会被当成seed。这个方法可使得随机数值是真正不可预测的。 
srand() : 其值是当次awk_script运行过程中前次srand(x)的设定的seed值x,。 
2) 常见awk内置字符串函数 
index(in, find) : 返回字符串in中字符串find第一次出现的位置(索引从1开始),如果在字串in中找不到字符串find,则返回值为0。eg: print index(“peanut”,”an”) 会印出3。 
length(s) : 求出字符串s的字符个数。eg: length(“abcde”) 是5。 
match(s,r) : 返回模式字符串r在字符串s的第一次出现的位置,如果s不包含r,则返回值0。 
sprintf(fmt,exp1,…) : 和printf类似印出,是sprintf不是打印而是返回经fmt格式化后的exp。 
eg: sprintf(“pi = %.2f (approx.)”,22/7) 传回的字串为”pi = 3.14 (approx.)” 
sub(p, r,t) : 在字符串t中寻找符合模式字符串p的最靠前最长的位置,并以字符串r代替最前的p。 
eg: str = “water, water”sub(/at/, “ith”,str) 结果字符串str 会变成”wither, water” 
gsub(p, r, t) : gsub与sub类似。不过时在字符串t中以字符串r 代替所有的p。 
eg: str=”water, water” ; gsub(/at/, “ith”,str) 结果字符串str会变成”wither,wither” 
substr(str, st, len) : 传回str的子字符串,其长度为len字符,从str的第st个位置开始。如果len没有出现,则传回的子字符串是从第st个位置开始至结束。 
eg: substr(“washington”,5,3) 传回值为”ing” 
substr(“washington”,5) 传回值为”ington” 
split(s,a,fs) : 在分隔符fs为分隔符将字符串s分隔成一个awk数组a,并返回a的下标数。 
eg: awk ‘BEGIN{print split(“123#456#789″,myarray,”#”)}’ 将打印 3 。 
tolower(str) : 将字符串str的大写字母改为小写字母。 
eg: tolower(“MiXeD cAsE 123″) 传回值为”mixed case 123” 
toupper(str) : 将字符串string 的小写字母改为大写字母。 
eg: toupper(“MiXeD cAsE 123″)传回值为”MIXED CASE 123” 
3) 常见awk内置系统函数 
close(filename) : 将输入或输出的文件filename 关闭。 
system(command) : 此函数允许调用操作系统的指令,执行完毕後将回到awk程序。 
eg: awk ‘BEGIN {system(“ls”)}’ 

8 自定义函数 
复杂的awk常常可以使用自己定义的函数来简化。调用自定义的函数与调用内置函数的方法一样。 
1) 自定义函数定义的格式: 自定义函数可以在awk程序的任何地方定义。 
function fun_name (parameter_list) { // parameter_list是以逗号分隔的参数列表 
body-of-function // 函数体,是awk语句块 

2) 举例: 
awk ‘{ print “sum =”,SquareSum($1,$2) } 
function SquareSum(x,y) { sum=x*x+y*y ; return sum } ‘ grade.txt 

9.awk的数组 
数组使用前,不必预先定义,也不必指定数组元素个数。 
1) 访问数组的元素。经常使用循环来访问数组元素,下面是一种循环类型的基本结构: 
for (element in array_name ) print array_name[element] 
2) 举例: awk ‘BEGIN{print split(“123#456#789″,mya,”#”) ; for (i in mya) { print mya[i] }} ‘ 

10.其他 
1) 为了避免碰到awk错误,可以总结出以下规律: 
① 确保整个awk_script用单引号括起来。 
② 确保awk_script内所有引号成对出现。 
③ 确保用花括号括起动作语句,用圆括号括起条件语句。 
④ 可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。 
⑤ 如果使用字符串,一定要保证字符串被双引号括起来(在模式中除外)。 
2) 在awk中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为name=$n。(这里name为调用的域变量名, n为实际域号。) 
3) 通常在BEGIN部分给一些变量赋值是很有益的,这样可以在awk表达式进行改动时减少很多麻烦。 
4) awk的基本功能是根据指定规则抽取输入数据的部分内容并输出,另一个重要的功能是对输入数据进行分析运算得到新的数据并输出,这是通过在 awk_script中对字段变量($1、$2、$3…)从新赋值或使用更大的字段变量$n(n大于当前记录的NF)而实现的。 
5) 使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。这时就需要字符串屏蔽序列。awk中经常使用的屏蔽序列有: 
\b 退格键 \t tab键 \f 走纸换页 \ddd 八进制值 \n 新行 \r 回车键 
\c 任意其他特殊字符。eg: \\为反斜线符号 
6) awk的输出函数printf,基本上和C语言的语法类似。 
① 格式: printf (“输出模板字符串”,参数列表) 
② 参数列表是以逗号分隔的列表,参数可以是变量、数字值或字符串。 
③ 输出模板字符串的字符串中必须包含格式控制符,有几个参数就要求有几个格式控制符。模板字符串中可以只有格式控制符而没有其它字符。 
④ 格式控制符: %[-][width][.prec]fmt 
% : 标识一个格式控制符的开始,不可省略。 
– : 表示参数输出时左对齐,可省略。 
width : 一个数字,表示参数输出时占用域的宽度,可省略。 
.prec : prec是一个数值,表示最大字符串长度或小数点右边的位数,可省略。 
fmt : 一个小写字母,表示输出参数的数据类型,不可省略。 
⑤ 常见的fmt : c ASCII字符 
d 整数 
e 浮点数,科学记数法 
f 浮点数,如 123.44 
g 由awk决定使用哪种浮点数转换e或f 
o 八进制数 
s 字符串 
x 十六进制数 
⑥ 举例: echo “65” | awk ‘{ printf (“%c\n”,$0) }’ // 将打印 A 
awk ‘BEGIN{printf “%.4f\n”,999}’ //将打印 999.0000 
awk ‘BEGIN{printf “2 number:%8.4f%8.2f”,999,888}’ // 将打印 2 number:999.0000 888.000

 

来源:http://blog.chinaunix.net/space.php?uid=12461657&do=blog&id=3206951

 

 

awk的基本功能是对文件进行指定规则浏览和抽取信息。
基本格式:
(1) awk [-F 分隔域] ‘command’ input-file(s)
(2) 写入shell脚本中
(3) awk -f awk-script-file input-file(s)

注意:这里如果使用if等编程语句,要用{}括起来。

test

name    grade    score    id
hover    2        96        2003073
twq        3        91        2003074
zsm        4        92        2003075
hzm        5        95        2003076
bl        6        96        2003077

1,文本过滤处理:
(1) awk ‘{print $0}’ test   #打印文件的全部内容
注意:这里awk使用函数print用来打印整个文件的内容。其中的$0就表示整个文件的内容。

(2) awk ‘{print $1}’ test   #抽取文件test中的第一列
注意:如果awk没有使用-F指定分隔符号,默认的分隔符号是空格和TAB键。

#列出所有的用户名和登陆的shell名
awk -F : ‘{print $1,$6}’ /etc/passwd

(3) awk -F : ‘$1==”root” {print $0}’ /etc/passwd
指打印用户名为root的那一行

2,文本格式定制
(1)给输出信息加上表头
awk -F : ‘BEGIN {print “name        shell\n——————————–“}
    {print $!”\t”$6}’ /etc/passwd

(2)
awk -F : ‘BEGIN {print “name        shell\n——————————–“}
    {print $!”\t”$6} END {“end-of-report”}’ /etc/passwd

3,在awk中使用正则表达式
^                表示匹配行首的字符
[…]            匹配[]正的任意一个字符
(str1|str2)        匹配含有str1或str2的行        
.                匹配任意一个字符

(1)匹配
为使一域匹配一正则表达式,可以使用以下两种方法:
    1)$n~正则表达式
    2)if($n~正则表示式) print $0

awk -F: ‘$0 ~ /^root/’ /etc/passwd  #打印以root开头的行
awk -F: ‘{if($0 ~ /^root/) print $0}’ /etc/passwd  #和上一句等效

*精确匹配*
#打印名字为root的用户在/etc/passwd文件中的记录
awk -F : ‘$1==”root” {print $0}’ /etc/passwd
#打印路径为/root的用户在/etc/passwd中的记录
awk -F : ‘$6==”\/root” {print $0}’ /etc/passwd

4,在awk中使用条件操作符
<    小于        >=    大于等于
<=    小于等于    ~    匹配正则表达式
==    等于        !~    不匹配正则表达式
!=    不等于

(1)模糊匹配
i)使用if         {if($1~/zhengxh/) print $0}
ii)不用if        ‘$0 ~ /zhengxh/’
ex:
    awk ‘$0~/zhengxh/’ filename
    或awk ‘{if($0~/zhengxh/) print $0} filename    #输出含有zhengxh的行
    或awk ‘/zhengxh/’ filename

(2)精确匹配
$n==”chars”
    awk ‘$1==”zhengxh” {print $0}’ filename        #输出第一列等于zhengxh的行

(3)反向匹配
$n !~ /adf/
    awk ‘$1 !~ /zhengxh/ {print $0}’ filename    #输出第一列不是zhengxh的行

(4)大小写匹配
    awk ‘/[zZ]hengxh/’  filename     #匹配含有zhengxh 或是Zhengxh的字符串
    
(5)使用或运算
    awk ‘$0 ~ /(zhengxh|hover)/’ filename     #查找含有zhengxh或hover字串的行
    或awk ‘{if($0~/zhengxh/ OR $0~/hover/) print $0}’ filename

(6)内置变量
ARGC    命令行参数个数
ARGV    命令行参数排列
ENVIRON    环境变量支持队列的
FNR        浏览文件的记录数
FS        设置输入域分隔符,与-F同
NF        记录域的个数
NR        已读的记录数
OFS        输出域分隔符
ORS        输出记录分隔符
RS        控制记录分隔符

awk 的具体运用(FAQ)
* 把一个文件中满足条件的放到一个文件不满足条件的放到另一个文件
awk -F: ‘{if(NF==6) print $0 > “yes” else print $0 > “no” }’ filename

*如何在awk中使用变量
要注意的是在awk中的表达式一般是用”号括起来的,在shell中单引号是全屏蔽符,所以用单引号使得变量无法生效,在使用shell变量时,可以这样使用

##########################

#/bin/sh
#

name=”zhengxh”

count=`awk -F: ‘
    /’${name}’/{        #这里需要使用变量的地方把变量隔开
        sum+=$3    
    }
    
    END { print sum }
‘`

*使用awk输出文件的倒数第N行
tail -n $N $filename | awk ‘{if(NR==1) print $0}’

*)如何在AWK中使用外部变量
1)aa=”aaaaaaa”
awk ‘{print “‘”${aa}”‘”}’ $filename
2)
以下使用外部变量时有错:
#!/bin/bash
filepath=/etc/passwd
user=root
result=`awk -F”:” ‘/$user/ { print $1}’ $filepath`
echo $result
$
改正:
awk -F’:’ ‘/'”$user”‘/{print $1}’ $filepath

*如何把AWK中的值,传送到外部的SHELL变量
使用$() 或 “
aa=`awk -F: ‘{print $0}’ $filename` 

*进行统计
文件aa.txt
一个用户可能有多个记录,这时只统计一次:

数据          用户ID        下载文件名称   用户所在地  等。。。。。
20071128,0001,1,null,600571021800,028  
20071128,0002,1,null,600571001800,021
20071128,0002,1,null,600571001802,021
20071128,0003,1,null,600571031800,020
20071128,0004,1,null,600571001800,010

统计各个的号码(最后一个字段)数量
awk -F, ‘{if(!b[$2$6]){a[$6]++;b[$2$6]++}}END{for(i in a){print i,a[i]}}’

*如何把多个语句放在一句话(一行)中处理
cat “$file” | awk ‘{ip=$1; i=index($0,”\google”); if(i>1){ua = substr($0,i); print ip “\t” ua}}’

*把记录
aa,bb,cc [name, address, age]
变成记录
ip,aa,bb,cc [ip,name,address,age]

awk -F,    ‘{pirntf “\”192.168.5.154\”,”$0}’ 

*取一个字符串的首字母
str=abc
echo ${str:0:1}
echo $str|awk ‘{print substr($0,1,1)}’
echo $str|sed ‘s/\(.\).*/\1/’

*如何在一字符串的前面加上字符串 addtext
awk ‘{print “addtext \””$0″\””}’ temp

*计算不重复的列的总和
aa|001|23
ac|001|23
bb|002|213
cc|004|32
dd|005|34

awk -F’|’ ‘!a[$1]++{sum+=$3} END{print sum} ‘ filename

*定义多个分界符
aa cc dd 
bb,ee ff

awk -F'[ ,]’ ‘{print $3}’ filename
 
有时候有可能出现多个分隔符号,但是我们需要把它当成一个,这时就要用:
***
#echo “adf::adf:f” | awk -F'[:]+’ ‘{print $2}’
#adf
***
#echo “adf::adf:f” | awk -F’:’ ‘{print $2}’
#                            #输出空
***

*如何用awk处理这样的文件格式?
源文件格式:
   
表1313
                               客户经理业绩情况表(月报表)
支局所名称:XXXX储蓄所    月份:10      
客户经理
业绩(累计日积数)
酬金
姓名                  代号     活期               整整3月
整整6月               整整1年            整整2年                整整3年
整整5年             整整8年               零整1年             零整3年
零整5年              定活两便         
兰                  37040576  0.00                 0.00                 0.00
0.00                 0.00                 0.00                 0.00
0.00                 0.00                 0.00                 21340.00
0.00                 0.00                  
禚树征              37040585  27277.21             120.00               0.00
2965.22              0.00                 0.00                 0.00
0.00                 0.00                 0.00                 0.00
0.00                 845615151469035520.00
秦                  37040502  20094.30             0.00                 0.00
0.00                 0.00                 0.00                 0.00
0.00                 0.00                 0.00                 0.00
0.00                 622937933443235840.00
           合     计          444868.41            0.00                 0.00
2965.22              0.00                 0.00                 10764.20
0.00                 0.00                 0.00                 0.00
18600.00             13791245122257916000.00

如何用awk处理成以下格式(只要里面的记录并用逗号分割每个字段,最后一个字段不要,表头和表尾不要):
“兰”,37040576,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,21340.00,0.00                  
“禚树征”,37040585,27277.21,120.00,0.00,2965.22,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00
“秦”,37040502,20094.30,0.00,0.00,0.00,0.00,0.00,,0.00,0.00,0.00,0.00,0.00,0.00

awk ‘{sub(“[ \t]”, “,”); print $0}’ temp
awk ‘{sub(“[ ,\t]”, “,”); print $0}’ temp

*如何用TAB做分隔符号
awk -F’\t’
awk -F'[ \t]’  #默认是这样,以空格或TAB做分隔符
一般模式:awk -F’rexp’ ‘{}’ filename
这里rexp是一个正则表达式,用来指示要使用的分隔符。

*————————–
在awk脚本中有下面一段

BEGIN{split(“123#456#789″,team,”#”)}
END{for(i in team) print team}

预测的输出应该是
123
456
789
啊!

为什么实际的输出是
456
789
123
呢?

答:

while(++i in team) print team[i]

—————————-

*-awk中使用system()
answer:
ls | awk ‘{if (system(“ls ” $0) == 0) {print “file ” $0 ” exists !”}}’

*-调用外部命令和awk结合
使用getline得到外部命令的输入f
 ls | awk ‘{getline ll; print $ll}’

————————–
*-只输出第一行的内容
awk ‘{print; exit}’

*-多shell命令
awk ’BEGIN{while(“dir|sed 1,3!d”|getline)print $1}‘

*-在awk的输出中加单引号
#cat file
rwxrwsrwx   gprs    512 GPRS

awk ‘{printf(“%s %s ‘”‘%s'”‘ %s\n”,$1,$2,$3,$4)}’ file
    在这里要理解的是:上面的表达式分成了三块,前面的”内的内容是一块,中间的双引号内的内容是一块,最后的单引号里的内容是一块;由于单引号在双引号中的作用被屏蔽,所以输出的变量会带上单引号。从而达到预定结果。

*-得到df -h 显示出来的百分数字(去掉百分号)
(1)df -h | awk ‘{if(NR!=1) print $5}’ | cut -d% -f 1
(2)df -h | awk -F'[ \t%]+’ ‘{if(NR!=1) print $5}’

***
实现加和
中间结果如下所示:
CPU usr sys idl
0 13 4 76
1 9 4 79
要想显示下列结果:
1 22 8 155
***
cat data | awk ‘{if(NR!=1) a+=$1;b+=$2;c+=$3} END{print a,b,c,d,e}’

***
如何实现以几个字母中任意一个打头的字符串的查找
cat data
Mike Harrington:(510) 548-1278:250:100:175
Christian Dobbins:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50
Archie McNichol:(206) 548-1348:250:100:175
Jody Savage:(206) 548-1278:15:188:150
Guy Quigley:(916) 343-6410:250:100:175
Dan Savage:(406) 298-7744:450:300:275
Nancy McNeil:(206) 548-1278:250:80:75
John Goldenrod:(916) 348-4278:250:100:175
Chet Main:(510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300

awk -F'[ :]’ ‘$1~/^[MJ] {print $1}’

输出以D开头的域
awk -F’:’ ‘{for(i=1;i<=NF;i++) if($i~/^D/) print $i}’ data2

****每一行的和
统计
#cat ab
a 1
a 2
b 2

awk ‘{a[$1]+=$2} END{for(i in a) print i,a[i]}’ file

———————————–
*对两个文件的处理
———-
大家好,想请教一个问题,我现在有两个文件,如下所示,这两个文件格式都是一样的。我想首先把文件2的第五列删除,然后用文件2的第一列减去文件一的第一列,把所得的结果对应的贴到原来第五列的位置,请问这个脚本该怎么编写?
file1:
50.481  64.634  40.573  1.00  0.00
51.877  65.004  40.226  1.00  0.00
52.258  64.681  39.113  1.00  0.00
52.418  65.846  40.925  1.00  0.00
49.515  65.641  40.554  1.00  0.00
49.802  66.666  40.358  1.00  0.00
48.176  65.344  40.766  1.00  0.00
47.428  66.127  40.732  1.00  0.00
51.087  62.165  40.940  1.00  0.00
52.289  62.334  40.897  1.00  0.00
file2:
48.420  62.001  41.252  1.00  0.00
45.555  61.598  41.361  1.00  0.00
45.815  61.402  40.325  1.00  0.00
44.873  60.641  42.111  1.00  0.00
44.617  59.688  41.648  1.00  0.00
44.500  60.911  43.433  1.00  0.00
43.691  59.887  44.228  1.00  0.00
43.980  58.629  43.859  1.00  0.00
42.372  60.069  44.032  1.00  0.00
43.914  59.977  45.551  1.00  0.00

–答–
awk ‘NR==FNR{a[NR]=$1}NR!=FNR{$5=a[FNR]-$1;print}’ file2 file1

说明:
当NR==FNR时,是第一个文件,到了第二个文件时FNR会从0开始计数,而NR却继续在原来的基础上自增。
先把第一个文件中要使用的内容保存到一个数组中,然后在处理第二个文件时才使用。
这里包含了很好的处理多个文件的方法,值得借鉴。
————————————————-

**
源文件如下:
37123456,123456789,601234020200051640,”孔霞”,”03″,123456789,”2008/01/06″,1,4000,5060.41
37123456,123456789,601234020200062521,”栗汝礼”,”03″,123456010,”2008/01/06″,1,100,110.91
37123456,123456789,601234020200069800,”柯纯龙”,”03″,370786017,”2008/01/06″,1,20000,19500
37123456,123456789,601234020200069800,”柯纯龙”,”03″,123456030,”2008/01/06″,1,31000,500
37123456,123456789,601234020200068018,”严凤书”,”03″,123456789,”2008/01/06″,2,50000,100163.39
37123456,123456789,601234020200070039,”刘庆”,”03″,123456789,”2008/01/06″,2,4000,8000
37123456,123456789,601234020200060554,”王兰英”,”03″,123456789,”2008/01/06″,1,1600,91.26
37123456,123456789,601234020200070039,”刘庆”,”03″,123456789,”2008/01/06″,2,4000,4000
37123456,123456789,601234020200067710,”罗有艳”,”03″,123456789,”2008/01/06″,2,3000,12012.01
37123456,123456789,601234020200064742,”孙祥婷”,”03″,123456789,”2008/01/06″,1,50,12.61
37123456,123456789,601234020200069800,”柯纯龙”,”03″,123456030,”2008/01/06″,1,200,300
37123456,123456789,601234020200060554,”王兰英”,”03″,123456789,”2008/01/06″,1,1000,1091.26
处理要求如下:
如果第三列中的数据是唯一的,就保留这一行,如果有重复的,就保留最后一个记录行。

——–答———
awk -F, ‘{a[$3]=$0}END{for( i in a)print a[i]}’ urfile

——————————

*如何快速获取特定字符串的前2(n)行和后2(n)行
$cat file

put 8
put 9
put 10
abc
put 11
put 12
put 13
put 14
abc
put 15
put 16
put 17
put 18
abc
put 19
put 20
put 21
put 22
put 23
abc
put 24
put 25
put 26
put 27
abc
put 28
put 29
put 30
put 31
put 32
abc
put 33
put 34
put 35
put 36
put 37

$ awk ‘{a[NR]=$0}/abc/{for(i=2;i>=0;i–) print a[NR-i];for(j=1;j<=2;j++){if(!getline) exit;print}print “”}’ urfile
小结: 
(1)这里使用了数组的功能,数组在作为缓存是普遍用法,要记住。 
但这里如果文件超大的话,缓冲区的负担太大,应换存自己需要的哪些行(这里我只换存了4行)
$ awk ‘{a[NR%4]=$0}/abc/{for(i=2;i>=0;i–) print a[(NR-i)%4];for(j=1;j<=2;j++){if(!getline) exit;print}print “”}’ urfile
(2)使用了getline函数– $ man awk  就知道,getline函数的作用是: 1)读取下一行2)set $0 
注意这两个元素的应用.

*)如何提取aaaa12123adsf adfadfbbbb 的aaaa和bbbb中间的内容
$cat file
adfaaaaadfadfadfdfadabbbb
adfaaaaadf  ad323452 adfadfdfadabbbbz
$
1)sed -e ‘s/.*\(aaaa\)\(.*\)\(bbbb\).*/\2/g’ file
2)sed -e ‘s/.*\(a\{3\}\)\(.*\)\(b\{3\}\).*/\2/g’ file
3)echo “aaaa121312dfadfbbbbb” | awk -F’aaaa|bbbb’ ‘{print $2}’

*)我以如下字符要处理

a  123
b  124
c   125
a   126
d   127
e   128
ac  129

如果第一列出现两次或两次以上将其打印出来,并计算出现次数。
$ awk ‘{a[$1]++;} END{for(i in a) if(a[i]>=2) {print i,a[i]}}’ file
分析: 由以上的命令可以得到流程:
a[“a”] 2
a[“b”] 1
a[“c”] 1
a[“d”] 1
a[“e”] 1
a[“ac”] 1
而for(i in a)  则是要遍历的i的值是:a,b,c,d,e,ac

*)去掉重复的行
awk ‘!a[$0]++’ file

*)去掉重复行,并保持顺序不变
awk ‘f[$0]!=1{print;f[$0]=1}’ 

*)打印重复行
1)awk ‘{a[$0]++} END{for(i in a) {if(a[i]>1){print i}}}’ filename
2)sort cc  | uniq -dc

*)如何匹配多个模式
1)awk ‘/p1|p2/’ file
2)awk ‘/zhengxh|\<root\>’ file

*)设定字段分隔符
1)awk -F’:’ ‘{OFS=”-“}{print $1,$2,$3}’ file

*)范围查找
1)awk -F’:’ ‘/20080501[2-9]/’ file

*)数字计算求和 file:
hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95
drills QTY: 2 PRICE: 29.99 TOTAL: 59.98
punches QTY: 7 PRICE: 3.59 TOTAL: 25.13
drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18
bits QTY: 55 PRICE: 1.19 TOTAL: 65.45
saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77
nails QTY: 800 PRICE: .19 TOTAL: 152
screws QTY: 80 PRICE: .29 TOTAL: 23.2
brads QTY: 100 PRICE: .24 TOTAL: 24

1)awk ‘{x=x+$2}’ file

*)

3  0.022913642968727541
2   0.022706007307485104
2  0.50444767354650166
3   0.022128299612739447
6   0.025468440060252208
1  0.022856042968727539

第一列相同则第二列对应值求和。。。输出$1,sum

1)awk ‘{a[$1]=+$2; b[“2″$1]++} END{for(i in a) if(b[“2″i]>1) print i,a[i]}’ file

*)我以如下字符要处理
a  123
b  124
c   125
a   126
d   127
e   128
ac  129

如果第一列出现 两次或两次以上 将其打印出来,并计算出现次数。

1)awk ‘{a[$1]++} END{for(i in a) print i,a[i]}’ file
——

*)awk中如何显示大数据
1)awk  ‘{printf”%.f\n”, NR + 1211439408282}’   filename

*)awk使用外部变量
1)awk ‘{if($3==”‘$a'”) print $1,$2,”‘$b'”,$4}’ text
2)awk ‘{if($3==’\”$a\”‘) print $1,$2,’\”$b\”‘,$4}’ text

*)
文件内容:
74683 1001
74683 1002
74683 1011
74684 1000
74684 1001
74684 1002
74685 1001
74685 1011
74686 1000
….
100085 1000
100085 1001

文件就两列,希望处理成
74683 1001 1002 1011
74684 1000 1001 1002

就是只要第一列数字相同, 就把他们的第二列放一行上,中间空格分开
————–
1) awk ‘{a[$1]=sprintf(“%s %s”, a[$1],$2)} END{for(i in a) print i,a[i]}’ file
2) awk ‘{a[$1]=a[$1]” “$2} END{for(i in a)print i,a[i]}’ data13

*)
76523  1001 1002
76524  1002 1003
76526  1000 1003
76528  1000
….
100025  1000 1025

请教下, 文件第一列已按大小排序, 现在想按第一列的顺序, 把没有出现的行数补上
实现
76523  1001 1002
76524  1002 1003
76525
76526  1000 1003
76527
76528  1000
….
100025  1000 1025

怎样能够直接补上这些缺失的行
——————-
1)???????

*)
每个字段形如 <data name=”CYRSBH” value=”320400725220211″/>,如何高效的提取value=”*****”中间的*** 望各位不吝赐教
————-
1) grep -o “value=.*\”” data7 | awk -F'”‘ ‘{print $2}’
2) sed ‘s/.*value=”\(.*\)”.*/\1/’ file

*)

两个文件
a
b

#cat a
a1    b=1  num=3  c=2
a3   b=1   num=3  c=3
bc    f=3    num =2 f=3
fa     f=4    num=2  f=6

#cat b
a4    b=1   num=6 c=3
a1    b=1  num=5 c=2
bc    f=3    num =1 f=3
fb    f=4    num=3  f=6

要求对比两个文件
条件1:如果文件a中有和文件b第1,2,4部分都相同的行则用文件b中该行的第三部分num=x
其x的值减去文件a中该行第三部分num=x其x的值,并将结果连同该行的其他部分写入文件c

例如:
文件b中第二行a1    b=1  num=5 c=2的第一部分:a1
,第二部分b=1,第4部分c=2和文件a的第一行a1    b=1  num=3
c=2相应部分相同则将结果
a1    b=1  num=2 c=2    写入文件c
(num=2是文件b的num=5减去文件a的num=3的得来的)

条件2:如果条件1中num后数值相减后该结果为负值则将文件b中的该行直接写入文件c
例如:b中的第三行bc    f=3    num =1 f=3与文件a中的第三行bc    f=3    num =2
f=3的1,2,4部分相同,但是num后数值的运算结果为-1
(1减2得来的)所以直接将文件b中的该行bc    f=3    num =1 f=3直接计入文件c

条件3:如果文件a中没有找到和文件b中1,2,4部分相同的行则将文件b中的该行直接写入文件c
例如:文件b的第四行fb    f=4    num=3
f=6,在文件a中无法找到和他第1,2,4部分相同的行所以直接将该行写入文件写入文件c
条件4:a或者b本文本身中不会出现第1,2,4部分相同的行

test.awk

#!/bin/awk -f
NR==FNR {

        sub(/.*=/ ,”” ,$3)
        h[$1$2$4] = $3
}
NR>FNR {

        i = 0
        sub(/.*=/, “” ,$3)
        if($1$2$4 in h) {

                i = $3 – h[$1$2$4]
        }
        if(i>0) $3 = “num=”i
        else $3 = “num=”$3
        print
}

awk -f test.awk a b > c

*)awk对文件进行分流
$cat file:

00:49:42.025791        14058101005        2008-05-31 09:41:2
-00:00:34.974209        14058101003        2008-05-31 10:31:4

目的是把以00开头的行输出到一个文件,-00开头的行输出到一个文件,用一条awk语句可以实现么?

*)
如何在文件中使用awk设定的变量
参考: #awk -v min=43922 -v max=52059 ‘{a[$1]}END{for(i=min;i<=max;i++)if(!(i in a))print i}’

*)
3  0.022913642968727541
2   0.022706007307485104
2  0.50444767354650166
3   0.022128299612739447
6   0.025468440060252208
1  0.022856042968727539
。。。
第一列相同则第二列对应值求和。。。输出$1,sum

这样的是错误的!!!
#awk  ‘a[$1]+=$2; END{for(i in a) print i,a[i]}’ cata3
right : 
awk  ‘{a[$1]+=$2} END{for(i in a) print i,a[i]}’ cata3

*)
有一个类似于这样的文本:
16  001agdcdafasd
16  002agdcxxxxxx
23  001adfadfahoh
23  001fsdadggggg

我想要得到
16  001
16  002
23  001
23  002

在awk中,就是取$2的前三个字符,但是不知道如何处理
大家帮帮忙哦,先谢谢了:)
—-

1)awk ‘{print $1,substr($2,1,3)}’
2)sed ‘s/\(.* …\).*/\1/’ file 
3)grep -o ‘^.\+ \+…’ file 

*)把文件 file
CHN0401
部门1组
分部门查询
吴斌

CHN0402
部门2组
查询
李演

CHN0403
部门3组
查询
李路

变为
——————————————-
CHN0401 部门1组 分部门查询 吴斌

CHN0402 部门2组 查询 李演

CHN0403 部门3组 查询 李路

1)
awk ‘/CHN/{h=$1; sub(“\n”,””,h); printf “%s “,h; for(i=0; i<=3; i++) {if(getline var) { sub(“\n”,””,var);} var=sprintf(“%s “, var); printf “%s”,var; }print “”;}’ file

2) 
$cat ff.awk  

#!/bin/awk -f
#
/CHN/{

    h=$1; 
    sub(“\n”,””,h); 
    printf “%s “,h; 
    for(i=0; i<=3; i++) 
    {

        if(getline var) 
        {
 
            sub(“\n”,””,var);
        } 
        var=sprintf(“%s “, var); 
        printf “%s”,var;
    }
    print “”;
} file

$ff.awk filename


#!/bin/awk -f
#
/CHN/{

    s=$0;
    for(i=0; i<=3; i++)
    {

        getline
        s=sprintf(“%s %s”, s,$0);
    }
    printf “%s”, s;
    print “”;
} file

*替换特定行之间的行
*) 替换注释行<!– –> 
<!– <mapping
                        resource=”0.xml” />–>
<mapping resource=”1.xml” />
  <mapping resource=”2.xml” />
<!– <mapping
                        resource=”3.xml” />
–>
  <mapping resource=”4.xml” />
<!–
<mapping
                        resource=”5.xml” />
–>

<!– <mapping resource=”6.xml” />–>
  <mapping resource=”7.xml” /> 

1)awk ‘BEGIN{RS=”<!–|–>”}NR%2’ urfile

*)使用多个单词作为分隔符
awk -F’word1|word2′ ‘{print $3}’

*) 把不同的结果定向到不同的文件中去
有这样个文件

123|0|444
123|1.00|444
588|222|333

现在想把第2个字段为0的取出来输出到一个文件,并删除该记录,用awk如何实现,谢谢
代码如下:
———————————————–

[zhengxh@hoverzg stdshell]$ cat dd
123|0|444
123|1.00|444
588|222|333

#注意在输出的文件名前面要加双引号
[zhengxh@hoverzg stdshell]$ awk -F’|’ ‘{if($2==0)print >”file1″; else print >”file2″}’ dd
[zhengxh@hoverzg stdshell]$ cat file1
123|0|444
[zhengxh@hoverzg stdshell]$ cat file2
123|1.00|444
588|222|333

———————————————–

*)
比如解析下面一行:
123||name||address||age
我想以“||”为分割符,这样各个域为“123”, “name”,“age”

1)awk -F”[|]+” ‘{print $1}’ filename

*)单引号的输出
1) awk ‘BEGIN{print “‘\’看我的\””;}’

*)找出不含指定字符串的行
awk ‘!(/abc/||/def/)
找出不含abc或者不含def的列作为条件

———————————————–
[zhengxh@hoverzg stdshell]$ awk ‘!(/dd/||/1/) {print }’ dd
588||222||333
[zhengxh@hoverzg stdshell]$ cat dd
123||0||444
123||1.00||444
588||222||333

———————————————–

*)只处理最后一行
1)awk ‘END{ print $0}’ test
2)tail -1 | awk …

*)只是处理第一行
1) awk ‘{print $0; exit}’ filename
2) head -1 file | awk …

*)处理文件中指定的n行
1) awk ‘{if(NR==n) print }’
2) head -n | tail -m | awk …

*) 某个文本文件,当逐行读取时,当发现第一个字段是空格或空值时(cut -d’  ‘
-f1),就将所在行与上行合并。

1)awk ‘/^[^ \t]/{printf “\n”$0}; /^[ \t]/{printf $0}END{printf “\n”}’ file
1*) awk ‘BEGIN{getline;printf $0}/^[^ \t]/{printf “\n”$0};\ 
    /^[ \t]/{printf $0}END{printf “\n”}’ urfile
#注意如果用print是不能实现的,因为print 会打印一个\n 
解释: 
    如果前面的字符不是空格就打印一个\n,再打印这一行,
    如果是就直接打印但不换行

2)sed ‘:a;N;/\n[[:blank:]]\+/{s/\n//;ba};P;D’ 数据文件
解释:
:a  设置跳转标签
N 读入下一行
/\n[[:blank:]]\+/{s/\n//;ba}
如果下一行是以空白开头的话,就把换行符删除,
然后再读取下一行,直到读取到不是以空白开头的行
P; 打印第一个换行符之前的内容
D; 删除第一个换行符之前的内容,并重新开始循环

*) 
有个文件格式如下:
aaa
bbb
ccc
yyyuu
jjjkkk
sss
aaa
ccc
。。。。
有重复的字符串,要求对每个不一样的字符串计数并按计数的降序排列输出。输出的文件就只有各个不一样的字符串而已。

sort b | uniq -c | sort

*)
$ cat file
    DAA=
    123413
    ZZASDF 
    DAA=
    123413
    ZZASDF 
    DAA=
    123413
    ZZASDF 

$ awk ‘BEGIN{RS=”DAA=”} {gsub(/[^\n]/,”9″,$0); if(length($0)>0) printf “%s %s”,RS,$0}’ file

*)
———————–
各位大牛好:
     小的有这样两个文件,记录不同查询出来的次数。
文件一 a.txt,有两个字段,一个是次数,一个是pid,具体如下:
      2 CC214798313J90000000000
      1 CC214798119J90000006000
      1 CC214790518J90000001000
      1 CC214790518
      1 CC214788013J90000005000
      1 CC214788013
      1 CC214783814J90000003000
      1 CC214783814J90000002000
      1 CC214783814
      1 CC214778610
文件二,b.txt ,也有两个字段,一个是次数,一个是pid,具体如下:
      1 CC153301918J90000010000_765
      1 CC120143642J90000043000_765
      1 CC000024062J90033095000_765
      1 CC000001583J90000044000_765
      1 CC000001583J90000046000_768
      1 CC130012773J90000076000_765
      1 CC130012773J90000063000_765
      1 CC130012773J90000064000_765
      1 CC130012773J90000051000_765
      1 CC130012773J90000052000_765
      1 CC138037658J90000044000_538

这两个文件记录的pid是可能相同的,我想把这两个文件组成一个文件:
次数1 次数2 pid
2 0 CC214798313J90000000000
1 0 CC214798119J90000006000

也就是合并两个文件中的两个字段 ,组成三个字段的第三个文件。
请假兄弟姐妹们。谢谢

*在指定行插入一行

awk ‘1;NR==1{print “addadf”}’ file

—————————————–

*awk能实现对一个文件进行不同条件的匹配,然后按匹配的不同输出不同的文件吗??

比如这样的文件:
##a1a1a1a1
b1:
@c1c1c1c1c1
d1:
%e1e1e1e1

##a2a2a2
b2:
@c2c2c2c2
d2:
%e2e2e2e2

将满足#开头的记录输出的a文件,将@开头的记录输出的b文件,将%的文件输出到c文件
所有操作希望通过一个脚本文件实现

这样条件我都知道怎么去配置就是不知道怎么按条件的不同输出啊,awk脚本能实现,如果不能怎么去实现它呢。
希望大侠们指教呢

do:
awk ‘BEGIN{FS=””;a[“#”]=”a”;a[“@”]=”b”;a[“%”]=”c”}($1 in a){print > a[$1]”.txt”}’ urfile
awk ‘BEGIN{FS=””;a[“#”]=”a”;a[“@”]=”b”;a[“%”]=”c”}($1 in a){print > a[$1]”.txt”}’ urfile

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157671.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • js算法初窥05(算法模式02-动态规划与贪心算法)

    在前面的文章中(js算法初窥02(排序算法02-归并、快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而

  • springcache清除缓存_什么叫做缓存数据

    springcache清除缓存_什么叫做缓存数据概述从spring3开始,spring开始支持缓存组件,并提供了一系列非常方便的注解。其中,Cache接口定义了基本的增删改查方法,Spring提供了一些默认的实现,比如RedisCa

  • MySQL与Oracle的区别_oracle表空间和mysql

    MySQL与Oracle的区别_oracle表空间和mysqlmysql与Oracle的区别

  • C语言基础知识入门(大全)「建议收藏」

    C语言基础知识入门(大全)「建议收藏」一.C语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课!更多详细进阶教程等你领取!可以关注公众号“C和C加加”回复“ZXC”即可免费获取!二.C语言的具体结构简单来说,一个C程序就是由若干头文件和函数组成。 #include<stdio.h>就是一条预处理命..

  • net::ERR_CLEARTEXT_NOT_PERMITTED Android9.0无法加载url

    net::ERR_CLEARTEXT_NOT_PERMITTED Android9.0无法加载url

  • Spring常用的三种注入方式「建议收藏」

    Spring常用的三种注入方式「建议收藏」Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。构造方法注入先简单看一下测试项目的结构,用maven构建的,四个包:entity:存储实体,里面只有一个User类dao:数据访问,一个接口,两个实现类service:服务层,一个接口,一个实现类,实现类依赖于IUserDaotest:测试包在spring的配置文

    2022年10月22日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号