- 浏览: 79374 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (69)
- liunx (17)
- java (13)
- c (2)
- javascript (7)
- hibernate (3)
- usefull (1)
- algorithm (3)
- oracle (7)
- web (5)
- apache (5)
- database (4)
- win7 (2)
- feeling (1)
- ultraedit (1)
- powerdesigner (1)
- cache (2)
- personal (1)
- formula (1)
- c# (1)
- webservice (1)
- eclipse (2)
- git (1)
- ssh (1)
- regular (2)
- thread (2)
- nginx (1)
- android (1)
- jvm (1)
- hadoop (1)
- winscp (1)
最新评论
-
emilyzhanghong:
server端出现这个问题了,用你的方法解决了,谢谢
Unable to find required classes Attachment support is disabled解决方案 -
xufeng52645264:
我用的MyEclipse8.5自带的xFire开发的web s ...
Unable to find required classes Attachment support is disabled解决方案 -
smallsilver:
看到的,就转发过来了,现在到达这个级别太难了!~自己顶今年发大 ...
程序员技术练级攻略 -
thomastangweixin:
...
程序员技术练级攻略
转自:http://hi.baidu.com/beibeiboo/item/c0cb1856ba4344474eff20ab
########################
# 关于awk的多文件处理
########################
awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件。
如:
1. shell的Pathname Expansion方式:
awk '{...}' *.txt
# *.txt先被shell解释,替换成当前目录下的所有*.txt,
# 如当前目录有1.txt和2.txt,则命令最终为awk '{...}' 1.txt 2.txt
2. 直接指定多个文件:
awk '{...}' a.txt b.txt c.txt ...
# awk对多文件的处理流程是,依次读取各个文件内容,如上例,先读a.txt,再读b.txt....
那么,在多文件处理的时候,如何判断awk目前读的是哪个文件,而依次做对应的操作呢?
########################
# 处理 2 个文件
########################
当awk读取的文件只有两个的时候,比较常用的有两种方法:
(1) 一种是
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
或
awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
(2) 另一种是 awk 'NR==FNR{...;next}{...}' file1 file2
当awk读取的文件只有两个的时候,比较常用的有两种方法:
(1)一种是
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
或
awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
(2) 另一种是
awk 'NR==FNR{...;next}{...}' file1 file2
了解了FNR和NR这两个awk内置变量的意义就很容易知道这两种方法是如何运作的
FNR The input record number in the current input file. #已读入当前文件的记录数
NR The total number of input records seen so far. #已读入的总记录数
next Stop processing the current input record. The next input record is
read and processing starts over with the first pattern in the AWK
program. If the end of the input data is reached, the END block(s),
if any, are executed.
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
# 读入file1的时候,已读入file1的记录数FNR一定等于awk已读入的总记录数NR,因为file1是awk读入的首个文件,故读入file1时执行前一个命令块{...}
# 读入file2的时候,已读入的总记录数NR一定>读入file2的记录数FNR,故读入file2时执行后一个命令块{...}
awk 'NR==FNR{...;next}{...}' file1 file2
# 读入file1时,满足NR==FNR,先执行前一个命令块,但因为其中有next命令,故后一个命令块{...}是不会执行的
# 读入file2时,不满足NR==FNR,前一个命令块{..}不会执行,只执行后一个命令块{...}
########################
# 处理 多个 文件
########################
当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来,所以就要用到更通用的方法了:
1. ARGIND # 当前被处理参数标志
awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...复制代码
2. ARGV # 命令行参数数组
awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...复制代码
3. 把文件名直接加入判断
awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...复制代码
########################
# 例子 1
########################
现有file1,file2 两个文件。文件file1有2列,内容如:
no1 name1
no2 name2
no3 name2
no4 name3
no5 name4
no6 name4
no7 name4
no8 name5
no9 name6
no10 name6
文件file2 有6列,部分有空格,内容如下:
name1 data1 dada2 data3 data4 dada5
name2 dada6 data7 dada8
name3 data9 dada10 data11 dada12
name4 data13 dada14
name5 data15 dada16
name6 data17 data18
如果file1的第2列跟file2的第1列匹配,则将两条数据合并成一条,合并后的数据应该是这样的:
no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18
程序:
awk 'NR==FNR{a[$1]=$0}NR>FNR{print $1" "a[$2]}' file2 file1
########################
# 例子 2
########################
file1:
sina.com 52.5
sohu.com 42.5
baidu.com 35
file 2:
www.news.sina.com sina.com 80
www.over.sohu.com baidu.com 20
www.fa.baidu.com sohu.com 50
www.open.sina.com sina.com 60
www.sport.sohu.com sohu.com 70
www.xxx.sohu.com sohu.com 30
www.abc.sina.com sina.com 10
www.fa.baidu.com baidu.com 50
www.open.sina.com sina.com 60
www.over.sohu.com sohu.com 20
合并的结果:
www.news.sina.com sina.com 80 52.5
www.over.sohu.com baidu.com 20 42.5
www.fa.baidu.com sohu.com 50 35
www.open.sina.com sina.com 60 52.5
www.sport.sohu.com sohu.com 70 42.5
www.xxx.sohu.com sohu.com 30 42.5
www.abc.sina.com sina.com 10 52.5
www.fa.baidu.com baidu.com 50 35
www.open.sina.com sina.com 60 52.5
www.over.sohu.com sohu.com 20 42.5
程序:
awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2
########################
# 关于awk的多文件处理
########################
awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件。
如:
1. shell的Pathname Expansion方式:
awk '{...}' *.txt
# *.txt先被shell解释,替换成当前目录下的所有*.txt,
# 如当前目录有1.txt和2.txt,则命令最终为awk '{...}' 1.txt 2.txt
2. 直接指定多个文件:
awk '{...}' a.txt b.txt c.txt ...
# awk对多文件的处理流程是,依次读取各个文件内容,如上例,先读a.txt,再读b.txt....
那么,在多文件处理的时候,如何判断awk目前读的是哪个文件,而依次做对应的操作呢?
########################
# 处理 2 个文件
########################
当awk读取的文件只有两个的时候,比较常用的有两种方法:
(1) 一种是
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
或
awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
(2) 另一种是 awk 'NR==FNR{...;next}{...}' file1 file2
当awk读取的文件只有两个的时候,比较常用的有两种方法:
(1)一种是
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
或
awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
(2) 另一种是
awk 'NR==FNR{...;next}{...}' file1 file2
了解了FNR和NR这两个awk内置变量的意义就很容易知道这两种方法是如何运作的
FNR The input record number in the current input file. #已读入当前文件的记录数
NR The total number of input records seen so far. #已读入的总记录数
next Stop processing the current input record. The next input record is
read and processing starts over with the first pattern in the AWK
program. If the end of the input data is reached, the END block(s),
if any, are executed.
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
# 读入file1的时候,已读入file1的记录数FNR一定等于awk已读入的总记录数NR,因为file1是awk读入的首个文件,故读入file1时执行前一个命令块{...}
# 读入file2的时候,已读入的总记录数NR一定>读入file2的记录数FNR,故读入file2时执行后一个命令块{...}
awk 'NR==FNR{...;next}{...}' file1 file2
# 读入file1时,满足NR==FNR,先执行前一个命令块,但因为其中有next命令,故后一个命令块{...}是不会执行的
# 读入file2时,不满足NR==FNR,前一个命令块{..}不会执行,只执行后一个命令块{...}
########################
# 处理 多个 文件
########################
当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来,所以就要用到更通用的方法了:
1. ARGIND # 当前被处理参数标志
awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...复制代码
2. ARGV # 命令行参数数组
awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...复制代码
3. 把文件名直接加入判断
awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...复制代码
########################
# 例子 1
########################
现有file1,file2 两个文件。文件file1有2列,内容如:
no1 name1
no2 name2
no3 name2
no4 name3
no5 name4
no6 name4
no7 name4
no8 name5
no9 name6
no10 name6
文件file2 有6列,部分有空格,内容如下:
name1 data1 dada2 data3 data4 dada5
name2 dada6 data7 dada8
name3 data9 dada10 data11 dada12
name4 data13 dada14
name5 data15 dada16
name6 data17 data18
如果file1的第2列跟file2的第1列匹配,则将两条数据合并成一条,合并后的数据应该是这样的:
no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18
程序:
awk 'NR==FNR{a[$1]=$0}NR>FNR{print $1" "a[$2]}' file2 file1
########################
# 例子 2
########################
file1:
sina.com 52.5
sohu.com 42.5
baidu.com 35
file 2:
www.news.sina.com sina.com 80
www.over.sohu.com baidu.com 20
www.fa.baidu.com sohu.com 50
www.open.sina.com sina.com 60
www.sport.sohu.com sohu.com 70
www.xxx.sohu.com sohu.com 30
www.abc.sina.com sina.com 10
www.fa.baidu.com baidu.com 50
www.open.sina.com sina.com 60
www.over.sohu.com sohu.com 20
合并的结果:
www.news.sina.com sina.com 80 52.5
www.over.sohu.com baidu.com 20 42.5
www.fa.baidu.com sohu.com 50 35
www.open.sina.com sina.com 60 52.5
www.sport.sohu.com sohu.com 70 42.5
www.xxx.sohu.com sohu.com 30 42.5
www.abc.sina.com sina.com 10 52.5
www.fa.baidu.com baidu.com 50 35
www.open.sina.com sina.com 60 52.5
www.over.sohu.com sohu.com 20 42.5
程序:
awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2
发表评论
-
ubuntu挂在ntfs硬盘
2014-10-27 10:28 454下载安装一个rpm包,如kernel-ntfs-2.4.2 ... -
winscp 显示乱码!
2014-10-27 10:23 561点击环境。右侧出现文件名UTF-8编码 旁边选择开启就可以 ... -
hadoop2.2.0 搭建时错误提示
2014-10-19 23:48 1907hadoop2.2.0 搭建时错误提示 You have ... -
window/linux查看端口和程序一些命令
2014-05-22 13:58 0在windows系统下: 直接上代码: C:\Docum ... -
ubuntu 12.10 默认安装php5-fpm无监听9000端口,nginx无法链接php5-fpm修正
2013-03-20 22:41 1285升级到ubuntu 12.10 后nginx报502错误,ph ... -
Linux Crontab 定时任务 命令详解
2013-02-20 21:08 894转自:http://blog.csdn.net/tianles ... -
CentOS 网络设置修改
2013-02-01 16:07 956一般CentOS 网络配置是根据自己的需求来设定的。但是,对于 ... -
linux 光盘挂载
2013-02-01 12:56 0手动挂载,报以下错误: mount: can’t find ... -
ubuntu
2013-01-31 22:16 0root默认没激活,你可以用sudo passwd root ... -
Linux下在当前目录及子目录下查找字符串的方式
2013-01-31 13:53 1363例如: 假设当前目录下test文件夹,1.txt,test文件 ... -
rpm转载 linux下查看已经安装的软件包信息
2012-08-09 21:21 928rpm -qa | grep target RPM ... -
linux基本用法(二)
2012-08-03 16:07 853chattr 的用法: 主要用在记录日志,只增加不删除的情况下 ... -
linux基本用法(一)
2012-07-27 23:33 0开始复习最简单的linux操作: ls的用法: [root@w ... -
“Linux典藏”之Linux入门视频讲解24集
2012-06-27 08:48 653“Linux典藏”之Linux入门视频讲解24集 http:/ ... -
Apache之Options参数详解
2011-10-27 13:50 1614指令控制了在特定目录 ... -
liunx 安装gcc过程!~
2011-04-24 20:29 1657首先从redhat的安装文件中找到如下的安装包: kerne ... -
liunx安装SpiderMonkey的操作过程!~
2011-04-24 20:18 2000SpiderMonkey是Mozilla项目的一部分,用C语言 ... -
liunx 安装 vim
2011-04-24 19:52 881解压语言包:tar zvxf /developtool/vim ... -
liunx 安装mysql
2011-04-23 15:35 995先用下面命令查看你的机器上是否有别的版本的mysqlrpm - ... -
liunx 网络环境配置!
2011-04-23 12:25 1508首先选择bridger和方式连接。并且vmware的虚拟网卡V ...
相关推荐
"巧用AWK处理二进制数据文件" AWK是Unix、Linux中处理文本的好工具,可以对复杂的文本文件进行整理,提取其中的全部或者部分数据,按照需要的格式予以显示。但是,AWK的强大功能只针对纯文本文件,对于带有很多不可...
使用 awk 将多个文件结果列合并到一个文件 在 Linux 环境下,使用 awk 工具可以将多个文件的结果列合并到一个文件中。这篇文章将介绍如何使用 awk 实现该功能,并提供了一个示例 awk 脚本来合并多个文件的结果列。 ...
在Shell脚本编程中,`awk`是一种强大的文本分析工具,尤其在处理文件时非常有用。...通过构建适当的数组结构和条件判断,我们可以解决多种文件处理问题,尤其在需要关联多个文件数据的情况下,`awk`数组显得尤为重要。
### AWK 文件处理总结 #### 一、AWK 入门篇 AWK 是一种强大的文本处理工具,常用于Linux/Unix环境下。它允许用户通过简单的脚本语言来进行复杂的文本处理任务。 **基本命令格式**: ```bash awk 'pattern { action...
它按照默认的分隔符(空格或制表符)将每行的内容分解成多个字段(通常称为域),并将这些字段存储在编号的变量中,变量从$1开始编号。如果没有指定特定的模式,则所有行都会被处理;如果指定了模式,那么只有匹配该...
在使用AWK处理文本时,它会根据内部变量FS(字段分隔符,默认为“空白字符”,包括空格、制表符等)来分解每一行记录成多个字段,并将它们存储在编号变量中(如$1、$2等)。AWK还使用内部变量OFS(输出字段分隔符,...
AWK基于行处理,每一行被视为一个记录,每个记录可以被分割成多个字段。默认情况下,字段是由空格或制表符分隔的。AWK程序由一系列规则和动作组成,规则定义了何时执行特定的动作。 ### 2. **AWK的语法** - **模式...
Awk按照记录和字段的方式来查看文本文件,每个记录通常对应文件的一行,而字段则是记录中的数据单元,例如一个单词或者一个数值。 ### 2. 基本概念 - **变量**: Awk中的变量用于存储数据,可以是数字或字符串。 - ...
- **字段划分**:每条记录可以被划分为多个字段(Field),字段之间通常通过空格或制表符分隔。例如,在员工薪资文件中,“A125Jenny100210”这条记录包含了四个字段:“A125”、“Jenny”、“100”、“210”。 ###...
- 替换多个字符串为同一个新字符串:`awk '{ gsub(/jayesh|hitesh|bhavesh/ , "mahesh"); print }' content.txt` 8. 配合其他命令,awk 可以增强其功能,例如与 `df` 命令结合,仅显示设备名、可用空间和使用率:`...
“文件(s)”则指定了需要处理的一个或多个文件。 #### 二、awk命令详解 1. **模式匹配**: awk支持正则表达式来匹配特定的模式。例如: ```sh awk '/root/' test ``` 这条命令将打印出文件`test`中包含单词...
设定多个字符(冒号、制表符和竖线)作为分隔符,并打印前三个字段。这种方式在处理具有多种分隔符的数据集时非常有用。 #### awk -F '[:\t|]' ‘{print $1}’ file 同上,但只打印第一列。展示了如何指定复杂的...
`awk`可以同时处理多个文件,如`awk 'ACTION' file1 file2 ...`。当处理多个文件时,`FNR`会跟踪每个文件的行数。 **9. 自定义函数** `awk`允许用户定义自己的函数,提高代码复用性和可读性。例如: ```awk ...
- **多文件处理**:awk可以处理多个文件,将结果合并输出。 - **环境变量**:通过环境变量 `FS` 和 `OFS` 控制字段和输出字段分隔符。 - **条件判断**:利用逻辑运算符 `&&`, `||` 等进行复杂的条件判断。 - **循环...
### Unix Shell Awk 修改Ini 文件的脚本 在Unix环境下,对配置文件(尤其是INI格式的文件)进行处理是一项常见的需求。...虽然脚本相对简单,但它为理解和应用Unix Shell和Awk处理复杂文本文件提供了很好的示例。
- **字段(Field)**:awk默认使用空格或制表符作为字段分隔符,将一行文本划分为多个字段。每个字段可以通过$1, $2, ... $NF引用,其中$NF表示最后一个字段。 - **模式(Pattern)**:模式可以是正则表达式或简单...
在Linux/Unix环境中,awk是一个标准工具,其强大之处在于能够对输入文件的每一行进行模式匹配,并执行相应的操作。 awk最初由Alfred Aho、Brian Kernighan和Peter Weinberger在贝尔实验室开发,随后被GNU项目采用并...