awk合并不同文件的指定字段-20150705

合集下载

awk使用大全

awk使用大全

awk使用大全内容提要: awk是AIX和UNIX上的最强大的文字匹配搜索工具。

本文详细介绍awk的适用方法。

awk 命令的输入awk 命令的输出通过记录和字段的文件处理awk 命令编程语言:模式操作变量特殊变量标志示例说明:在文件中查找与模式匹配的行,然后在它们上面执行特定的操作。

语法awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | ' Program ' } [ [ File ... | Assignment ... ] ] ...描述awk 命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行。

然后在任何与扩展正则表达式匹配的行上执行操作。

awk 处理的最大记录大小为10KB。

awk 命令的模式搜索比grep 命令的搜索更常用,且它允许用户在输入文本行上执行多个操作。

awk 命令编程语言不需要编译,并允许用户使用变量、数字函数、字符串函数和逻辑运算符。

awk 命令受到LANG 、LC_ALL 、LC_COLLATE 、LC_CTYPE 、LC_MESSAGES 、LC_NUMERIC 、NLSPATH 和PATH 环境变量的影响。

awk 命令的输入awk 命令采取两种类型的输入:输入文本文件和程序指令。

输入文本文件搜索和操作在输入文本文件上执行。

文件如下指定:在命令行指定File 变量。

修改特殊变量ARGV 和ARGC 。

在未提供File 变量的情况下提供标准输入。

如果用File 变量指定多个文件,则文件以指定的顺序处理。

程序指令用户提供的指令控制awk 命令的操作。

这些指令来自命令行的‘Program ’变量或来自用-f 标志和ProgramFile 变量一起指定的文件。

如果指定多个程序文件,这些文件以指定的顺序串联,且使用指令的生成的顺序。

awk 命令的输出awk 命令从输入文本文件中的数据产生三种类型的输出:·选定的数据可以打印至标准输出,此输出完全同于输入文件。

linux的awk命令的详细解释

linux的awk命令的详细解释

linux的awk命令的详细解释linux下awk是一个功能非常强大的文本分析工具,下面由店铺整理了linux的awk命令的详细解释,希望对你有帮助。

linux的awk命令的详细解释简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和Brian Kernighan 姓氏的首个字母。

实际上 AWK 的确拥有自己的语言: AWK 程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。

它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用方法awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中pattern 表示AWK 在数据中查找的内容,而action 是在找到匹配内容时所执行的一系列命令。

花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。

完整的awk 脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。

awk每接收文件的一行,然后执行相应的命令,来处理文本。

调用awk有三种方式调用awk1.命令行方式awk [-F field-separator] 'commands' input-file(s)其中,commands 是真正awk命令,[-F域分隔符]是可选的。

awk命令详解(转整理)

awk命令详解(转整理)

awk命令详解(转整理)awk命令详解(转整理)⼀、前⾔awk有3个不同版本: awk、nawk和gawk,未作特别说明,⼀般指gawk。

awk语⾔的最基本功能是在⽂件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。

完整的awk脚本通常⽤来格式化⽂本⽂件中的信息。

⼆、基本语法awk [opion] 'awk_script' input_file1 [input_file2 ...]awk的常⽤选项option有:① -F fs : 使⽤fs作为输⼊记录的字段分隔符,如果省略该选项,awk使⽤环境变量IFS的值② -f filename : 从⽂件filename中读取awk_script③ -v var=value : 为awk_script设置变量awk有三种运⾏⽅式:第⼀种,把awk的脚本命令直接放在命令中。

第⼆种,把awk的所有的脚本命令放在⼀个脚本⽂件中,然后⽤-f选项来指定要运⾏的脚本命令⽂件。

第三种,将awk_script放⼊脚本⽂件并以 #!/bin/awk -f 作为⾸⾏,给予该脚本可执⾏权限,然后在shell下通过键⼊该脚本的脚本名调⽤之。

三、awk脚本awk脚本可以由⼀条或多条awk_cmd组成,对于多个awk_cmd,⼀个awk_cmd完成后,应该另起⼀⾏,以便进⾏隔。

awk_cmd由两部分组成: awk_pattern { actions }。

另外,在awk命令中直接使⽤awk_script时,awk_script也可以被分成多⾏书写,但必须确保整个awk_script被单引号括起来。

awk命令的⼀般形式:awk ' BEGIN { actions }awk_pattern1 { actions }............awk_patternN { actions }END { actions }' inputfile其中 BEGIN { actions } 和 END { actions } 是可选的。

awk命令用法

awk命令用法

AWK 是一种流行的文本处理工具,它可以用于在文本文件中搜索、提取和修改数据。

基本语法:
Copy code
awk 'pattern { action }' file
其中,pattern 是一个正则表达式,用于匹配文本中的行。

action 是在匹配行上执行的操作。

file 是要处理的文件。

例如,使用awk 打印文件中所有以"root" 开头的行:
Copy code
awk '/^root/ {print}' /etc/passwd
AWK 也支持通过变量来操作文本数据。

比如,使用awk 统计文件中每行字符的个数:
Copy code
awk '{print length}' file
AWK还支持分隔符,默认是空格,可以使用-F 选项指定分隔符
例如,使用awk 打印CSV 文件中的第二列:
Copy code
awk -F, '{print $2}' file.csv
总之,AWK是一种强大的文本处理工具,可以用于在文本文件中搜索、提取和修改数据。

它具有简单的语法和强大的功能,在数据分析、日志分析和其他文本处理任务中非常有用。

awk命令使用方法

awk命令使用方法

awk命令使⽤⽅法1、基本语法awk '{pattern + action}' {filenames}awk语法中pattern表⽰在数据中查找的内容,⽽action是在找到匹配内容时所执⾏的⼀系列命令。

花括号({})不需要在程序中始终出现,但它们⽤于根据特定的模式对⼀系列指令进⾏分组。

pattern就是要表⽰的正则表达式,⽤斜杠括起来。

2、awk原理awk 对输⼊⽂件中的每⼀⾏都执⾏这个脚本:$ awk -F":" '{ print $1 }' /etc/passwd$ awk -F":" '{ print $1 $3 }' /etc/passwd$ awk -F":" '{ print $1 " " $3 }' /etc/passwd$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd-F参数:指定分隔符,可指定⼀个或多个print 后⾯做字符串的拼接NF:⼀条记录中⽤分割符分隔开来的字段数⽬NR:已经读出的记录数,就是⾏号,从1开始实例⼀:只查看test.txt⽂件(100⾏)内第20到第30⾏的内容[root@local]# awk '{if(NR>=5 && NR<=10) print $1}' test.txt5678910实例⼆:已知test.txt⽂件内容为[root@local]# cat test.txtI am Poe,my qq is 168请从该⽂件中过滤出'Poe'字符串与168,最后输出的结果为:Poe 168[root@local]# awk -F '[ ,]+' '{print $3" "$7}' test.txtPoe 1683、BEGIN和END模块通常,对于每个输⼊⾏,awk 都会执⾏每个脚本代码块⼀次。

Linuxawk命令详解

Linuxawk命令详解

选项含义-F fs 指定以 fs 作为输⼊⾏的分隔符,awk 命令默认分隔符为空格或制表符-f file从脚本⽂件中读取 awk 脚本指令,以取代直接在命令⾏中输⼊指令-v var=val 在执⾏处理过程之前,设置⼀个变量 var ,并设置初始值为 val Linuxawk 命令详解⼀、awk 命令介绍 除了使⽤ sed 命令,Linux 系统中还有⼀个功能更加强⼤的⽂本数据处理⼯具,就是 awk 。

它诞⽣于 20 世纪 70 年代末期,这也许是它影响了众多 Linux ⽤户的原因之⼀。

曾有⼈推测 awk 命令的名字来源于 awkward 这个单词。

其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho 、Weingberger 和 Kernighan ,awk 就取⾃这 3 为⼤师姓的⾸字母。

awk 的最基本功能是在⽂件或字符串中基于指定规则浏览和抽取信息,awk 抽取信息后,才能进⾏其他⽂本操作,完整的awk 脚本通常⽤来格式化⽂本⽂件中的信息。

awk 和 sed 命令类似,awk 命令也是逐⾏扫描⽂件(从第 1 ⾏到最后⼀⾏),寻找含有⽬标⽂本的⾏,如果匹配成功,则会在该⾏上执⾏⽤户想要的操作;反之,则不对⾏做任何处理。

awk 命令的基本格式为:[root@localhost ~]# awk [选项] '脚本命令' ⽂件名 此命令常⽤的选项以及各⾃的含义,如下表所⽰: awk 的强⼤之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执⾏命令,如下所⽰:'匹配规则{执⾏命令}' 这⾥的匹配规则,和 sed 命令中的 address 部分作⽤相同,⽤来指定脚本命令可以作⽤到⽂本内容中的具体⾏,可以使⽤字符串(⽐如 /demo/,表⽰查看含有 demo 字符串的⾏)或者正则表达式指定。

另外需要注意的是,整个脚本命令是⽤单引号('')括起,⽽其中的执⾏命令部分需要⽤⼤括号({})括起来。

awk用法(使用入门)

awk用法(使用入门)

awk⽤法(使⽤⼊门)awk ⽤法:awk ' pattern {action} '变量名含义ARGC 命令⾏变元个数ARGV 命令⾏变元数组FILENAME 当前输⼊⽂件名FNR 当前⽂件中的记录号FS 输⼊域分隔符,默认为⼀个空格RS 输⼊记录分隔符NF 当前记录⾥域个数NR 到⽬前为⽌记录数OFS 输出域分隔符ORS 输出记录分隔符1、awk '/101/' file 显⽰⽂件file中包含101的匹配⾏。

awk '/101/,/105/' fileawk '$1 == 5' fileawk '$1 == "CT"' file 注意必须带双引号awk '$1 * $2 >100 ' fileawk '$2 >5 && $2<=15' file2、awk '{print NR,NF,$1,$NF,}' file 显⽰⽂件file的当前记录号、域数和每⼀⾏的第⼀个和最后⼀个域。

awk '/101/ {print $1,$2 + 10}' file 显⽰⽂件file的匹配⾏的第⼀、⼆个域加10。

awk '/101/ {print $1$2}' fileawk '/101/ {print $1 $2}' file 显⽰⽂件file的匹配⾏的第⼀、⼆个域,但显⽰时域中间没有分隔符。

3、df | awk '$4>1000000 ' 通过管道符获得输⼊,如:显⽰第4个域满⾜条件的⾏。

4、awk -F "|" '{print $1}' file 按照新的分隔符“|”进⾏操作。

awk 'BEGIN { FS="[: \t|]" }{print $1,$2,$3}' file 通过设置输⼊分隔符(FS="[: \t|]")修改输⼊分隔符。

Linux命令高级技巧使用awk命令进行复杂文本处理和分析

Linux命令高级技巧使用awk命令进行复杂文本处理和分析

Linux命令高级技巧使用awk命令进行复杂文本处理和分析在Linux系统中,awk是一个强大的文本处理工具,它可以用于复杂的文本分析和处理任务。

本文将介绍一些使用awk命令的高级技巧,帮助你更好地处理和分析文本数据。

1. 简介awk是一种解释型脚本语言,它可以逐行扫描文本文件,并对每一行进行处理。

awk命令的基本用法是使用模式和动作的方式,其中模式用于指定要处理的行,动作用于指定对匹配的行要执行的操作。

2. 使用字段分隔符awk命令默认以空格作为字段分隔符,但可以使用-F选项来指定其他的字段分隔符。

例如,如果要使用逗号作为字段分隔符,可以使用以下命令:awk -F, '{print $1}' file.txt这个命令将打印出文件file.txt中的每一行的第一个字段。

3. 使用正则表达式匹配行awk命令支持正则表达式,可以使用//来指定要匹配的模式。

例如,如果要打印出包含"example"的行,可以使用以下命令:awk '/example/ {print}' file.txt这个命令将打印出文件file.txt中包含"example"的所有行。

4. 使用条件语句awk命令支持条件语句,可以根据条件来执行不同的操作。

条件语句的语法如下:if(条件){动作1}else{动作2}例如,如果要打印出文件file.txt中长度大于10的行,可以使用以下命令:awk '{if(length($0)>10) {print}}' file.txt这个命令将打印出文件file.txt中长度大于10的所有行。

5. 使用内置变量awk命令提供了一系列内置变量,可以方便地进行文本处理和分析。

以下是一些常用的内置变量:- NR:当前处理的行号- NF:当前行的字段数量- $0:当前行的内容例如,如果要打印出文件file.txt的行号和字段数量,可以使用以下命令:awk '{print NR, NF}' file.txt这个命令将打印出文件file.txt中每一行的行号和字段数量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法三 经典啊
[root@C66-test scripts]# cat filea.txt 韩海林 21 岁 海林韩 23 岁 韩林海 22 岁 林海韩 24 岁 [root@C66-test scripts]# cat fileb.txt 韩林海 男 海林韩 女 韩海林 女 林海韩 男
4
[root@C66-test scripts]#awk'NR==FNR{array[$1]=$0;next}{print array[$1],$2}' filea.txt fileb.txt 韩林海 22 岁 男 海林韩 23 岁 女 韩海林 21 岁 女 林海韩 24 岁 男
方法一
[root@C66-test scripts]# cat filea.txt 韩海林 21 岁 海林韩 23 岁 韩林海 22 岁 林海韩 24 岁 [root@C66-test scripts]# cat fileb.txt 韩林海 男 海林韩 女
1
韩海林 女 林海韩 男 [root@C66-test scripts]# awk '{if(NR != FNR ) {arrayb[$1]=$2} else {arraya[$1]=$2}}END{for(key in arraya)print key,arraya[key],arrayb[key]}' filea.txt fileb.txt 韩海林 21 岁 女 海林韩 23 岁 女 韩林海 22 岁 男 林海韩 24 岁 男
2
#命令行时候 if 中的 statement 表达式 需要用 {}括起来。
END { for(key in arraya) ##因为 arraya arrayb 有相同的 $1 数组元素名。 print key,arraya[key],arrayb[key] ##显示名字 年龄 性别 }
方法二
(此处相当于一个简单的判断和寻找过程,以名字为关键字去数组中找对应的元素)
} ##最后的输出就是合并的结果了。
###配合 awk 执行过程,理解此方法更好
6
小结:
1.了解 awk 执行过程。
2.next 命令的用法回顾 立刻停止处理当前行,读取下一行类似 C 语言中的 continue。 3.NR 和 FNR 区别。 NR 是目前所有输入的行号(总行号) FNR 是当前读入的文件中的行号。 [root@C66-test scripts]# awk '{print NR,FNR,$0}' filea.txt fileb.txt 1 1 韩海林 21 岁 2 2 海林韩 23 岁
awk 合并不同文件的指定字段
版本:V2.0 问题提出者:浮沉随浪(群友) 问题是否解决:是 文档作者:悠久之翼 修改记录:2015-07-05 系统环境:Centos 6.X (适合 32bit and 64bit) 内核版本:2.6.32 x86_64
格式约定: 蓝色字体:内容注释 目录: 问题描述: ...........................................................................................................................1 解决方法: ...........................................................................................................................1
3
方法二详解
###思路: ##可以理解为以把$2 或$0 追加到数组 array[$1]中 ##可是直接 array[$1]=$2 会把 array[$1]数据覆盖 ##合并 理解为追加 ##实现过程如下 array[$1]=array[$1]" "$2 ##这样不担心 array[$1]被覆盖问题了。 END{ for(key in array)print key,array[key] ###输出名字 key 和两个文件合并后的 $2 }
7
3 3 韩林海 22 岁 4 4 林海韩 24 岁 5 1 韩林海 男 6 2 海林韩 女 7 3 韩海林 女 8 4 林海韩 男
参考资料:
man awk,gawk-Effective AWK Programming
8
I
问题描述:
请使用 awk 命令将如下两份文件中名字相同的两行合并起来 A 文件: 韩海林 21 岁 海林韩 23 岁 韩林海 22 岁 林海韩 24 岁 B 文件:
韩林海 男 海林韩 男 韩海林 男 林海韩 男 输出效果: 韩海林 21 岁 男
解决方法:
解决方案 注:处理中文可能存在字符集问题 自己调试 LANG 变量
}
## array[$1]=$0 只会对第一个文件生效。
##处理完第一个文件后,array 数组会存放着所有 filea 文件内
容。数组名为$1(姓名)
{
##此处开始因为不符合 NR==FNR
##所以处理到了第二个文件时 执行下面命令
print array[$1],$2 ##以$1(也就是名字)为条件的 数组 array 中的元素
方法一 ...........................................................................................................................1 方法一详解 ...................................................................................................................2 方法二 ...........................................................................................................................3 方法二详解 ...................................................................................................................4 方法三 经典啊...............................................................................................................4 方法三详解 ...................................................................................................................5 小结: ................................................................................................................................... 7 参考资料: ...........................................................................................................................8
[root@C66-test scripts]# cat filea.txt 韩海林 21 岁 海林韩 23 岁 韩林海 22 岁 林海韩 24 岁 [root@C66-test scripts]# cat fileb.txt 韩林海 男 海林韩 女 韩海林 女 林海韩 男 [root@C66-test scripts]# awk '{array[$1]=array[$1]" "$2}END{for(key in array)print key,array[key]}' filea.txt fileb.txt 韩海林 21 岁 女 海林韩 23 岁 女 韩林海 22 岁 男 林海韩 24 岁 男
方法一详解
###思路: ##可以理解为以$1 为中心,合并两个文件的$2。 ##所以就把两个文件的$2 分开就好了。 ##实现过程如下。 { if(NR != FNR ) ##NR==FNR 代表第一个文件 NR!=FNR 代表第二个文件。 ##此判断是选择处理哪个文件。 {arrayb[$1]=$2} ##fileb 文件赋值给 arrayb[$1]数组 else {arraya[$1]=$2} ##filea 文件赋值给 arraya[$1]数组 } ##注:if (condition) statement [ else statement ]
#二变
5ቤተ መጻሕፍቲ ባይዱ
if(NR==FNR) {
a[$1]=$0
next
}
{
print a[$1],$2
}
#三解释
if(NR==FNR) { ##根据行号的差异判断是哪个文件 NR==FNR 就是第一个文件
array[$1]=$0
##把一个文件的每行赋值到数组中,数组名为$1 即姓名。
next
##停止处理当前行,读取下一行并开始处理
方法三详解
###思路: ##之前都是先处理后输出 ##也可以边处理边输出 ## 先处理 filea 文件,然后输出 ##实现过程如下 awk 'NR==FNR{array[$1]=$0;next} {print array[$1],$2}' filea.txt fileb.txt #一变 NR==FNR{ array[$1]=$0 next } { print array[$1],$2 }
相关文档
最新文档