Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2079522
  • 博文数量: 470
  • 博客积分: 10206
  • 博客等级: 上将
  • 技术积分: 5620
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-03 12:50
文章分类

全部博文(470)

文章存档

2012年(1)

2011年(18)

2010年(47)

2009年(404)

分类:

2009-04-18 15:06:16

cat prod.sql

/data/GD3/GD3_abm_idx01.dbf
/data/GD3/GD3_abm_tab01.dbf
/data/GD3/GD3_ams_idx01.dbf
/data/GD3/GD3_ams_tab01.dbf
/pata/GD3/GD3_ams_idx01.dbf

  尽管他们的目录不一样,但是他们的文件名却是一样的,如何用一个命令找出这儿文件中重复的文件名


awk -F/ 'a[$NF]++==1{print $NF}' prod.sql


a[$NF]++==1是什么意思哦        ?

[ 本帖最后由 greendays 于 2009-4-15 18:58 编辑 ]



您对本贴的看法:
| |

风云使者
皇家救星



CU编号: 796256
注册:2008-12-20
最后登录: 2009-04-17
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]     顶部
发表于 2009-4-15 19:08 
awk -F/ 'a[$NF]++ == 1{print $NF}' prod.sql

-F / 以/为分隔
$NF 最后一个域,即文件名
a[$NF]++ 即文件名对应的键值加1

这个脚本利用了awk的特性,做了很多缩写,完整脚本应该如下:

CODE:
awk -F/ '
{
if (a[$NF] == 1) {print $NF}
a[$NF] = a[$NF] + 1;
}
' prod.sql

这个脚本换成
awk -F/ 'a[$NF]++{print $NF}' prod.sql
效果会更好



您对本贴的看法:

__________________________________

三分天注定 七分靠打拼
| |

骑士




CU编号: 544242
注册:2007-3-28
最后登录: 2009-04-17
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]     顶部
发表于 2009-4-16 11:08 
awk -F/ 'a[$NF]++{print $NF}' prod.sql
这么写好像有问题.

当prod.sql有以下数据时:
/data/GD3/GD3_ams_idx01.dbf
/data/GD3/GD3_ams_tab01.dbf
/pata/GD3/GD3_ams_idx01.dbf
/data/GD3/GD3_abm_idx01.dbf
/data/GD3/GD3_abm_tab01.dbf
/data/GD3/GD3_ams_idx01.dbf
/data/GD3/GD3_ams_tab01.dbf
/pata/GD3/GD3_ams_idx01.dbf

结果为:
GD3_ams_idx01.dbf
GD3_ams_idx01.dbf
GD3_ams_tab01.dbf
GD3_ams_idx01.dbf

并非结果:
GD3_ams_idx01.dbf
GD3_ams_tab01.dbf

awk -F/ 'a[$NF]++==1{print $NF}' prod.sql
结果为:
GD3_ams_idx01.dbf
GD3_ams_tab01.dbf

awk -F/ 'a[$NF]++==2{print $NF}' prod.sql
结果为:
GD3_ams_idx01.dbf

awk -F/ 'a[$NF]++==3{print $NF}' prod.sql
结果为:
GD3_ams_idx01.dbf

awk -F/ 'a[$NF]++==4{print $NF}' prod.sql
结果为:


我认为a[$NF]++==1应该是文件个数.只要满足是大于等于2个的就打印出来.

[ 本帖最后由 yanxt 于 2009-4-16 11:16 编辑 ]



您对本贴的看法:
| |
  帅哥 ((小学生))
风云使者
小学生



CU编号: 468971
注册:2006-9-24
最后登录: 2009-04-17
帖子:
精华:0







状态:...保密...

[] [] [博客]


[]     顶部
发表于 2009-4-16 11:26 
回复 #3 yanxt 的帖子

[2]awk -F/ 'a[$NF]++==0{print NR,$NF}' 2
1 GD3_ams_idx01.dbf
2 GD3_ams_tab01.dbf
4 GD3_abm_idx01.dbf
5 GD3_abm_tab01.dbf

[2]awk -F/ 'a[$NF]++==0{print NR,$NF}' 2
1 GD3_ams_idx01.dbf
2 GD3_ams_tab01.dbf
4 GD3_abm_idx01.dbf
5 GD3_abm_tab01.dbf


[2]awk -F/ 'a[$NF]++==1{print NR,$NF}' 2
3 GD3_ams_idx01.dbf
7 GD3_ams_tab01.dbf


[2]cat -n 2
     1  /data/GD3/GD3_ams_idx01.dbf
     2  /data/GD3/GD3_ams_tab01.dbf
     3  /pata/GD3/GD3_ams_idx01.dbf
     4  /data/GD3/GD3_abm_idx01.dbf
     5  /data/GD3/GD3_abm_tab01.dbf
     6  /data/GD3/GD3_ams_idx01.dbf
     7  /data/GD3/GD3_ams_tab01.dbf
     8  /pata/GD3/GD3_ams_idx01.dbf


希望你能看明白



您对本贴的看法:

__________________________________

小学生
| |
  帅哥 (黑哥)
精灵使



CU编号: 631768
注册:2007-10-22
最后登录: 2009-04-18
帖子:
精华:0







状态:...在线...

[] [] [博客]


[]     顶部
发表于 2009-4-16 11:41 
回复 #2 皇家救星 的帖子

这个和LZ的不同。



您对本贴的看法:

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


| |

骑士




CU编号: 544242
注册:2007-3-28
最后登录: 2009-04-17
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]     顶部
发表于 2009-4-16 11:48 
回复 #4 wtuter 的帖子

明白.

但是没有问打印第几条数据.

不过又加深了一下理解.

谢谢!



您对本贴的看法:
| |
  帅哥 (黑哥)
精灵使



CU编号: 631768
注册:2007-10-22
最后登录: 2009-04-18
帖子:
精华:0







状态:...在线...

[] [] [博客]


[]     顶部
发表于 2009-4-16 11:52 


QUOTE:
a[$NF]++==1是什么意思哦        ?

就是判断a[$NF]的当前值是否为1, 然后a[$NF]自加1, 并把判断结果(真假)作为 a[$NF]++=1整个表达式的值。



您对本贴的看法:

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


| |
  帅哥
侠客



CU编号: 1237130
注册:2009-3-28
最后登录: 2009-04-17
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]     顶部
发表于 2009-4-16 18:39 
回复 #7 blackold 的帖子

这个是不是和c一样的呢
先结合++ 不过后缀++ 返回自增以前的值



您对本贴的看法:
| |
  帅哥 (黑哥)
精灵使



CU编号: 631768
注册:2007-10-22
最后登录: 2009-04-18
帖子:
精华:0







状态:...在线...

[] [] [博客]


[]     顶部
发表于 2009-4-16 18:45 
回复 #8 cssjtuer 的帖子

和C一样。



您对本贴的看法:

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


| |
  帅哥
精灵




CU编号: 690903
注册:2008-4-13
最后登录: 2009-04-18
帖子:
精华:0







状态:...在线...

[] [] [博客]


[]       顶部
发表于 2009-4-18 11:29 
回复 #2 皇家救星 的帖子

awk -F/ 'a[$NF]++ == 1{print $NF}' prod.sql

-F / 以/为分隔
$NF 最后一个域,即文件名
a[$NF]++ 即文件名对应的键值加1

这个脚本利用了awk的特性,做了很多缩写,完整脚本应该如下:

[Copy to clipboard] [ - ]
CODE:
awk -F/ '
{
if (a[$NF] == 1) {print $NF}
a[$NF] = a[$NF] + 1;
}
' prod.sql
兄弟分析的很精辟! 谢谢!
回复 #7 blackold 的帖子

先谢谢黑哥的经典讲解! 还有一个小问题麻烦您, 就是[$NF]默认的起始值是0吧?  就是第二次遇到相同的$NF,  这时候[$NF]的值变为1,才打印。
再往后[$NF]的值大于1就不打印了。



您对本贴的看法:
| |
  帅哥 (黑哥)
精灵使



CU编号: 631768
注册:2007-10-22
最后登录: 2009-04-18
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]     顶部
发表于 2009-4-18 12:33 
回复 #11 greendays 的帖子

啥经典啊?

$NF只是index(下标),是否打印,取决于a[$NF]。



您对本贴的看法:

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


| |
  帅哥
精灵




CU编号: 690903
注册:2008-4-13
最后登录: 2009-04-18
帖子:
精华:0







状态:...在线...

[] [] [博客]


[]       顶部
发表于 2009-4-18 12:54 
呵呵  天天都是看着您和Tim 的帖子学习进步的啊!  期待着有一天也成为你们那样的技术高手。    继续那个问题, 刚刚没有表达清楚。 意思是:就是a[$NF]默认的起始值是0吧?  就是第二次遇到相同的$NF,  这时候a[$NF]的值变为1,才打印。
第三次遇到相同的$NF,  a[$NF]的值为2就不打印了。

[ 本帖最后由 greendays 于 2009-4-18 12:56 编辑 ]



您对本贴的看法:
| |
  帅哥 (黑哥)
精灵使



CU编号: 631768
注册:2007-10-22
最后登录: 2009-04-18
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]     顶部
发表于 2009-4-18 13:00 
回复 #13 greendays 的帖子

对,awk的变量初始值(number)为0.

就是这个意思,没错。



您对本贴的看法:

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


| |
  帅哥
精灵




CU编号: 690903
注册:2008-4-13
最后登录: 2009-04-18
帖子:
精华:0







状态:...在线...

[] [] [博客]


[]       顶部
发表于 2009-4-18 13:28 
回复 #14 blackold 的帖子

呵呵 谢谢黑哥!


阅读(385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~