Chinaunix

标题: 如何去除这个空行 [打印本页]

作者: xxZZyyZZ    时间: 2012-10-06 21:57
标题: 如何去除这个空行
#cat a.txt
100 Jason Smith   
200 John Doe  
#cat b.txt
100 $5,000
  
200 $500

  b.txt中有空行,如何把这两个文件连接起来输出如下
100 Jason Smith   $5,000
200 John Doe  $500
作者: kk5234    时间: 2012-10-06 22:26
awk 'NR==FNR{a[$1]=$0;next}{if($1 in a)print a[$1],$2}' a.txt b.txt
作者: xxZZyyZZ    时间: 2012-10-07 11:00
回复 2# kk5234

谢谢2楼的倾情回复,2楼对awk的理解令人佩服,在下再追问几个问题
1、
以下这个命令:
awk ' NR==FNR{a[$1]=$0;next}{print a[$1]}' a.txt   
或者
awk ' NR==FNR{a[$1]=$0;next}{print a[$1]}' b.txt  为何输出都是空
2楼的"NR==FNR{a[$1]=$0;next}"这条命令 我的理解是“当NR==FNR时(即在文件a.txt中),把文件a.txt的记录放到a数组中”,此时,我后面直接接一个a.txt为何输出为空?


2、
以下这个命令:
awk ' NR==FNR{a[$1]=$0;next}{print a[$1]}' a.txt b.txt
输出如下:
100 Jason Smith
  
200 John Doe  
   
请高手们答疑解惑一下,究竟这条命令该如何理解,能否一步一步拆下来说清楚
作者: yestreenstars    时间: 2012-10-07 11:35
本帖最后由 yestreenstars 于 2012-10-07 11:38 编辑

1.你忽略了next的作用,awk ' NR==FNR{a[$1]=$0;next}{print a[$1]}'由于你后面只接了一个文件,所以这里的NR==FNR没有意义,{a[$1]=$0;next}的作用是把每一行数据读到数组a中,然后停止对当前行的处理,读入下一行数据,所以后面的{print a[$1]}会被忽略掉,所以什么都没输出。按照你的意义,你应该把next去掉,也就是awk ' NR==FNR{a[$1]=$0}{print a[$1]}'。

2.NR==FNR{a[$1]=$0;next}只对第一个文件有效,作用你也懂了,{print a[$1]}对第二个文件有用,第二个文件的每一行的$1分别是100、空、200,所以最后输出的就是:
100 Jason Smith
  
200 John Doe
作者: xxZZyyZZ    时间: 2012-10-07 22:42
谢谢yestreenstars的回复,很详细。
我找了一下awk处理多个文件的方法,在这个地址有详细的阐述,粘贴如下
http://hi.baidu.com/beibeiboo/item/c0cb1856ba4344474eff20ab  , 希望能对以后的人有所帮助。
作者: xxZZyyZZ    时间: 2012-10-08 09:35
看完上面资料,这个问题就有了另一种表达

awk  'NR==FNR{a[$1]=$2;next}{print $0,a[$1]}b.txt a.txt

作者: xxZZyyZZ    时间: 2012-10-08 09:36
少了一个' , 补上
awk  'NR==FNR{a[$1]=$2;next}{print $0,a[$1]}'  b.txt a.txt
作者: Shell_HAT    时间: 2012-10-08 09:54
回复 5# xxZZyyZZ


awk处理多个文件时的执行过程
http://bbs.chinaunix.net/viewthr ... ;page=2#pid12383055
作者: yexingren23    时间: 2012-10-08 23:24
join 命令是不是更简单一些。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2