免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3558 | 回复: 14
打印 上一主题 下一主题

2行高深的命令,关于awk,高手给解释下,成吗?感激不禁。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-06 11:05 |只看该作者 |倒序浏览
本帖最后由 zhxftj 于 2013-03-08 02:11 编辑

perl那行有人解释了,看楼下,呵呵,awk的 ,是不是我 发错地方了 ? 有解释的吗? 大虾呢,大虾呢 ??
file1:
a
c
e
And file2:

file2:
a  1
b  2
c  3
d  4
e  5
想要的文件如下
a  1
c  3
e  5
以下命令的 结果,谁能看懂命令,给分别解释下???尽可能详细点, 实在是菜鸟。。 和看天书似的 ,  感激不尽
$ awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if($0~i){n=1}}} n' file1 file2 |less|wc
     18      36     246
$ perl -ane'BEGIN{open G,shift@ARGV;chomp(@a=<G>);@h{@a}=();}exists$h{$F[0]}&&print' file1 file2 |less|wc
     12      24     173
$ awk 'FNR==NR{a[$0];next}($1 in a)' file1 file2 |less|wc
     12      24     173

论坛徽章:
0
2 [报告]
发表于 2013-03-06 11:23 |只看该作者
坐等中,。。。真的坐着等呢 。。。呵呵
sinian126 该用户已被删除
3 [报告]
发表于 2013-03-06 14:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
狮子座
日期:2014-03-27 12:53:15
4 [报告]
发表于 2013-03-06 14:57 |只看该作者
本帖最后由 ciedecem 于 2013-03-06 14:59 编辑

回复 1# zhxftj


第二条:
>perl -ane'BEGIN{open G,shift@ARGV;chomp(@a=<G>);@h{@a}=();}exists$h{$F[0]}&&print' file1 file2   
>perl -h
  -a              autosplit mode with -n or -p (splits $_ into @F)
  -n              assume 'while (<>) { ... }' loop around program
-e program      one line of program (several -e's allowed, omit programfile)

这里有个BEGIN,它会先执行,G就是file1的 文件描述符,指向文件。
@a存放file1中的内容
@h{@a}=()声明变量数组h,并初始化为空,这里是$h[a], $h, $[c]

命令行的参数帮我们做了很多事啊,可以将其修改为perl脚本就容易看多了
#!
BEGIN{
open G,shift@ARGV; #处理file1
chomp(@a=<G>);
@h{@a}=();
}

while(<>) #<>就是从命令行接受文件名字,因为在BEGIN中@ARGV被shift一次了,所以这里就是file2了
{
@F=split $_;
exists$h{$F[0]} &&print; #exists就是检查变量是否已经被声明或定义过.
}





sinian126 该用户已被删除
5 [报告]
发表于 2013-03-06 15:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2013-03-06 15:29 |只看该作者
写的再好的代码,都可能需要修改。如果可读性差,就成了一次性筷子,只能扔了。

其实挺简单的东西,为什么故弄玄虚,搞的像后空翻三周半的绝技呢?

论坛徽章:
0
7 [报告]
发表于 2013-03-06 20:25 |只看该作者
回复 4# ciedecem

谢谢回复。。。

@h{@a}=()声明变量数组h,并初始化为空,这里是$h[a], $h, $[c]
请问,这句啥意思呀。。

既然数组为空,又如何判断是否 存在??
何时赋值的??

论坛徽章:
1
狮子座
日期:2014-03-27 12:53:15
8 [报告]
发表于 2013-03-07 13:28 |只看该作者
回复 7# zhxftj


”    @h{@a}=()声明变量数组h,并初始化为空,这里是$h[a], $h, $[c]“

sorry,这里的h不是数组而是hash。正确的理解,可以是这样的,
在begin块中, @h{@a}=(); 等价于$h{a}=undef; $h{b}=undef; $h{c}=undef;假如这里的@a=(a, b, c);

关于@h{@a}的用法,你可以从《perl语言入门》 p308 哈希切片 章节中找到

关于exists的用法,你可以从http://perldoc.perl.org/
exists EXPR

Given an expression that specifies an element of a hash, returns true if the specified element in the hash has ever been initialized, even if the corresponding value is undefined.


论坛徽章:
0
9 [报告]
发表于 2013-03-08 02:10 |只看该作者
回复 8# ciedecem


谢谢, 终于看懂了 。。。呵呵
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2013-03-08 09:58 |只看该作者
没想到在这里也能遇到awk的~建议要问awk的去隔壁版块(Shell版块)~
  1. awk 'NR==FNR{a[$0]=1;next} {n=0;for(i in a){if($0~i){n=1}}} n'
复制代码
NR==FNR{a[$0]=1;next}其中NR==FNR的作用是只对第一个文件进行处理,也就是这里的file1文件,a[$0]=1的作用是以$0为下标建立数组a,其实这里没必要给数组赋值,所以“=1”可以省略,next的作用是使第一个文件只执行next前的脚本。
{n=0;for(i in a){if($0~i){n=1}}}nn=0的作用是使awk处理新数据时初始化n的值,不然会影响后面的判断,for(i in a)的作用是遍历数组a,以数组a的下标为自变量完成后面的脚本,if($0~i)的作用是判断$0是否包含i(也就是第一个文件的$0),如果包含,就给n赋值,这里只要不赋空值或者0就行,不一定要赋值1,最后面的n的作用是,如果前面的判断成功了,那么n=1,那么就会打印$0,因为n是一种简写,写全了就是n{print $0},这里看不懂就去shell版块看基础吧,如果前面判断失败了,那么n=0,此时什么都不会打印。
  1. awk 'FNR==NR{a[$0];next}($1 in a)'
复制代码
这个就比较简洁了~跟我写的一样~前面的FNR==NR{a[$0];next}就不解释了,跟上一个awk命令是一样的,($1 in a)的作用是,判断$1是不是数组a的成员(下标),如果是就执行默认的操作{print $0},如果不是就什么都不执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP