免费注册 查看新帖 |

Chinaunix

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

一个用来提取文本中某一个字段不重复的记录的脚本,望指教  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-14 16:12 |只看该作者 |倒序浏览
#cat distinct.sh

#!/bin/sh

touch distinct.new

awk '{if(NR == 1) print $0}' $1>./distinct.new

count_line=`more $1|wc -l`

init_var=2

while [ $count_line -ge $init_var ]
do

var=`awk '{if(NR == '"$init_var"' ) print $1}' $1`

grep $var distinct.new

if [ $? -eq 1 ]
then
  awk '{if(NR == '"$init_var"' ) print $0}' $1 >>./distinct.new
fi

init_var=`expr $init_var + 1`

done

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-11-14 16:24 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

能舉個範本來說明一下嗎?  ^_^

论坛徽章:
0
3 [报告]
发表于 2003-11-14 16:31 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

#cat file1
df 2
sd 2
df 4
fd 8
#distinct file1
将提取第一个字段不重复的记录
如果修改“var=`awk '{if(NR == '"$init_var"' ) print $1}' $1`”中的print后面的“$1”为“$2”,将提取第二个字段不重复的记录。:)

论坛徽章:
0
4 [报告]
发表于 2003-11-14 17:15 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

不错, 不知应用在哪里

论坛徽章:
0
5 [报告]
发表于 2003-11-14 21:20 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

这个。。。这个。。。
好像用awk实现显得更简洁些


  1. amy@box:~/temp$ more show.sh
  2. #!/bin/bash
  3. if [ $# -ne 2 ]; then
  4.         echo "Usage: <program_name> <filename> <column_num>"
  5.         exit 1
  6. fi

  7. FILENAME=$1
  8. COLUMN=$2

  9. COMMAND="awk '{a[\$$COLUMN]+=1; if(a[\$$COLUMN]==1) print \$$COLUMN}' $FILENAME"
  10. eval $COMMAND

  11. amy@box:~/temp$ more inputfile
  12. 1 aaa
  13. 1 bbb
  14. 2 aaa
  15. 1 ccc
  16. 2 bbb
  17. 3 aaa

  18. amy@box:~/temp$ ./show.sh inputfile 1
  19. 1
  20. 2
  21. 3

  22. amy@box:~/temp$ ./show.sh inputfile 2
  23. aaa
  24. bbb
  25. ccc
复制代码

论坛徽章:
0
6 [报告]
发表于 2003-11-15 09:30 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

COMMAND="awk '{a[\$$COLUMN]+=1; if(a[\$$COLUMN]==1) print \$$COLUMN}' $FILENAME"
eval $COMMAND

nocomment大侠,能解释一下上面两句话吗???:)

论坛徽章:
0
7 [报告]
发表于 2003-11-15 09:38 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

第一行是将awk这串字符赋值给COMMAND
这段awk字符的含义是:
在指定的列(具体那一列,由$COLUMN的值来指定)执行以下操作:
1. 将数组a[当前指定列的值]的值+1
2. 判断该数组项的值是否为1,也就是说第一次碰到这个列值
  如果是,则输出该列;否则,不做任何操作
这样就实现了屏蔽掉重复行的要求

第二行表示提取变量COMMAND的内容,并执行之

举个例子估计能说的更清楚些
假设有个文件,其内容如下:
aaa 111
bbb 222
aaa 333
bbb 444

那么执行到第一行的时候,数组项为a[aaa],其值为1
执行到第二行的时候,数组项为a[bbb],其值为1
执行到第三行的时候,数组项为a[aaa],其值为2
执行到第二行的时候,数组项为a[bbb],其值为2

那么执行相应的awk后就只显示第一行和第二行

论坛徽章:
0
8 [报告]
发表于 2003-11-15 11:47 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

能解释一下“a[\$$COLUMN”是什么意思吗?:)

论坛徽章:
0
9 [报告]
发表于 2003-11-16 21:25 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

a[]表示是一个数组元素
那么到底是第几个元素呢?
$COLUMN的值表示用户需要提取的列(利于第1列)
我们用来进行区分数组元素的是指定列的具体取值(例如第一列的值)
所以$$COLUMN就表示了这个具体的值
但是又不能在命令里之间这么写
所以先用字符串提取$COLUMN的值,然后用\?将字符$的特殊含义屏蔽掉
这样俺们生成的字符串中$$COLUMN就转换成了$1

ft,俺咋感觉自己越说越乱

另外,需要注意的是
shell中的数组下标不像C语言里,是数字下标
而是数字或字符都可以
例如,可以使用array[name], array[id]等等

论坛徽章:
0
10 [报告]
发表于 2003-11-18 08:36 |只看该作者

一个用来提取文本中某一个字段不重复的记录的脚本,望指教

太感谢nocomment,不过好像书里很少介绍到shell的数组的???郁闷啊!!!
:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP