无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

shell合并和分割

Posted on 2009-11-29 11:57 Gavin.lee 阅读(581) 评论(0)  编辑  收藏 所属分类: Linux shell 入门

 

• 实用的分类(sort)操作。
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下s o r t的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
post1  传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7
个字符开始。
举例:
按第一个域分类
-bash-3.00$ sort -k0 sed.txt
打印分类后的最后第一行
-bash-3.00$ sort -k0 sed.txt | tail -1
打印分类后的第一行
-bash-3.00$ sort -k0 sed.txt | head -1
awk使用sort输出结果
-bash-3.00$ sort -k0 sed.txt | head -1 | awk '{if($1=="caodejun")print $1}'
将两个分类文件合并
-bash-3.00$ sort -m  sed.txt sort.txt
将文件合并前,它们必须已被分类。合并文件可用于事务处理和任何种类的修改操作。
下面这个例子,因为忘了把两个家电名称加入文件,它们被放在一个单独的文件里,现在将
之并入一个文件。分类的合并格式为‘sort -m sorted_file1 sorted_file2’。

删除重复行
-bash-3.00$ sort -u sed.txt


• uniq
uniq用来从一个文本文件中去除或禁止重复行。一般uniq假定文件已分类,并且结果正确。我们并不强制要求这样做,如果愿意,可以使用任何非排序文本,甚至是无规律行。
-bash-3.00$ who | awk '{print $1} ' |uniq
liuzk423
605408211
shuzigui
nefu_luyanshen
waterlooz
wsoangel
tomotoboy
xp55699312
zyy0904
caodejun
duke1988
605408211
nefu_luyanshen
zyy0904
lonelysand


显示不唯一的行
-bash-3.00$ who | awk '{print $1} ' |uniq -d

-c打印每一重复行出现次数。
-bash-3.00$ who | awk '{print $1} ' |uniq -c
   1 liuzk423
   1 605408211
   1 shuzigui
   1 nefu_luyanshen
   1 waterlooz
   1 wsoangel
   1 tomotoboy
   1 xp55699312
   1 zyy0904
   1 caodejun
   1 duke1988
   1 605408211
   1 nefu_luyanshen
   1 zyy0904
   1 lonelysand
这里没有搞懂nefu_luyanshen明明重复,却显示重复行数目为1

对特定域进行测试,使用-n只测试一行一部分的唯一性。
-bash-3.00$ who | awk '{print $1} ' |uniq -n2
liuzk423


• join
将两个已经分好类的文件连接在一起哈。一些系统要求使用join时文件域要少于20,为公平起见,如果域大于20,应使用DBMS系统,其一般格式如下:
join [options] in_file1 in_file2

-bash-3.00$ cat sed.txt
605408211   pts/16       Jul 31 13:54   (218.0.1.42)
caodejun   pts/44       Jul 31 14:16    (219.148.133.31)
duke1988   pts/45       Jul 31 14:41    (218.104.163.66)
liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)
nefu_luyanshen   pts/23       Jul 31 14:33      (218.25.6.142)
nefu_luyanshen   pts/48       Jul 31 12:59      (218.25.6.142)
shuzigui   pts/21       Jul 31 12:11    (121.35.248.193)
tomotoboy   pts/41       Jul 31 13:31   (219.221.99.155)
waterlooz   pts/25       Jul 31 08:48   (121.0.29.225)
wsoangel   pts/35       Jul 31 13:40    (116.233.219.10)
xp55699312   pts/42       Jul 31 14:12  (61.152.132.103)
zyy0904    pts/43       Jul 31 13:53    (125.33.195.36)
-bash-3.00$ cat sort.txt
605408211   pts/16       Jul 31 13:54   (218.0.1.42)
caodejun   pts/44       Jul 31 14:16    (219.148.133.31)
duke1988   pts/45       Jul 31 14:41    (218.104.163.66)
-bash-3.00$ join sed.txt sort.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42) pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31) pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66) pts/45 Jul 31 14:41 (218.104.163.66)

选择匹配
-bash-3.00$ join -a1 -a2  sed.txt sort.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42) pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31) pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66) pts/45 Jul 31 14:41 (218.104.163.66)
liuzk423 pts/6 Jul 20 08:27 (219.245.104.240)
nefu_luyanshen pts/23 Jul 31 14:33 (218.25.6.142)
nefu_luyanshen pts/48 Jul 31 12:59 (218.25.6.142)
shuzigui pts/21 Jul 31 12:11 (121.35.248.193)
tomotoboy pts/41 Jul 31 13:31 (219.221.99.155)
waterlooz pts/25 Jul 31 08:48 (121.0.29.225)
wsoangel pts/35 Jul 31 13:40 (116.233.219.10)
xp55699312 pts/42 Jul 31 14:12 (61.152.132.103)
zyy0904 pts/43 Jul 31 13:53 (125.33.195.36)
-bash-3.00$ join -o 1.1 2.2  sed.txt sort.txt
605408211 pts/16
caodejun pts/44
duke1988 pts/45
-bash-3.00$ join -o 1.1 2.2  2.3 sed.txt sort.txt
605408211 pts/16 Jul
caodejun pts/44 Jul
duke1988 pts/45 Jul


• cut
cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
下一节将介绍粘贴用法。
cut一般格式为:
cut [options] file1 file2
下面介绍其可用选项:
-c list  指定剪切字符数。
-f field  指定剪切域数。
-d   指定与空格和t a b键不同的域分隔符。
- c用来指定剪切范围,如下所示:
- c 1,5-7  剪切第1个字符,然后是第5到第7个字符。
-c1-50  剪切前5 0个字符。
-f 格式与- c相同。
-f 1,5  剪切 第1域,第5域。
- f 1,10-12  剪切第1域,第1 0域到第1 2域。

-bash-3.00$ ps -ef | cut -c1-8
-bash-3.00$ ps -ef | cut -d: -f1
-bash-3.00$ ps -ef | cut -d: -f1,3


• paste
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用 paste可以将这些数据粘贴
起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相
同。
paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔
新行中不同文本,除非指定- d选项,它将成为域分隔符。paste格式为:
paste -d -s -file1 file2
选项含义如下:
-d   指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s   将每个文件合并成行而不是按行粘贴。
            - 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。


• split
split用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可
能更容易。使用v i或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题。
因此有时没有选择余地,必须将文件分割成小的碎片。
split命令一般格式:
split -output_file-size input-filename output-filename
这里output_file-size 指的是文本文件被分割的行数。
-bash-3.00$ ps -ef |split -10
-bash-3.00$ ls
a.out            greeting.sh      main.c           sort.txt         xac              xai              xao
append.sed       grepgrepstrings  nohup.out        test             xad              xaj              xap
change.sed       grepstr          readme.sh        test.sh          xae              xak              xaq
core.log         hello            seawolf          user.online      xaf              xal              xar
factorial        hello.cpp        sed.out          xaa              xag              xam
factorial.c      main             sed.txt          xab              xah              xan

只有注册用户登录后才能发表评论。


网站导航: