Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3029414
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-27 15:29:39

1)

$ cat a
Name    Age     Number
zhang   20      001
li      22      002
wang    19      003
$ cat b
Age     Name    Number
21      ma      004
22      liu     005
20      li      006
$ cat c
Number  Age     Name
007     23      zou
008     20      xie
009     20      wan

有三个文件,彩色部分是每列的标签。每个文件的标签顺序不一样,要求每列根据固定的标签顺序合并文件得到下面的结果:

Name    Age     Number
zhang   20      001
li      22      002
wang    19      003
ma      21      004
liu     22      005
li      20      006
zou     23      007
xie     20      008
wan     20      009

 

  1. awk 'BEGIN{print "Name\tAge\tNumber"}FNR==1{for(i=1;i<=NF;i++)a[$i]=i}FNR>1{print $a["Name"]"\t"$a["Age"]"\t"$a["Number"]}' a b c

[解析]

  一开始我也对这个文本每列的按序输出伤了点脑筋。首先在 BEGIN 中打印出标签,把每个文件的第一行,也就是每个文件的标签行,用for循环依次对第一行的标签为下标,存进数组a里,并且给每个下标的数组赋值。从第2行开始打印对应好的数组下标的值,那就是$1,$2,$3... 在这个时候就按照下标对列进行了按序输出。

 


2)

cat file

A B C D

1 2 3 4

1 2 3 4

1 2 3 4


要取出B列和C列,关键问题是B列和C列出现的列的位置不固定。


  1. awk 'BEGIN{print "B C"}NR==1{for(i=0;i++<NF;)a[$i]=i;next}{print $a["B"],$a["C"]}' file
  2. B C
  3. 2 3
  4. 2 3
  5. 2 3

[解析]

先把第一行所有的内容存入数组a,并对应其所在的字段数,然后第二行开始按照下标是B和C的数组对应的字段数打印出该域。


阅读(5636) | 评论(1) | 转发(1) |
0

上一篇:正则表达式元字符

下一篇:seq命令详解

给主人留下些什么吧!~~

2011-06-09 15:18:51

好帖,学习了