sort、uniq命令(可以对文本内容过滤除重)、split分割文件

来源:互联网 发布:轩辕剑盾牌进阶数据 编辑:程序博客网 时间:2023/12/03 09:07
文章来自:http://blog.chinaunix.net/u1/40226/showart_315762.html

1.uniq----过滤、统计、删除重复行
  uniq [options][file1 [files]]

$ uniq -c file  [newfile]  file中的重复行输出一次,并在每行前显示重复次数
$ uniq -d file  [newfile] file中的重复行输出一次,但不输出唯一的行
$ uniq -u file  [newfile]       只输出file中的唯一行
$ uniq file1 file2 把file1中的重复的相邻行删除,并把每行的一个拷贝送到file2
注意:用uniq 命令除重 必须用sort命令进行递增或递减排序后才能用。
sort  file 
uniq  file
或直接使用
sort -u file  这条命令包括排序及除重
[root@lmailmms root]# more cwm.txt
133  2008-02-17
133  2008-02-16
133  2008-04-10
132  2007-08-11
[root@lmailmms root]# uniq -w 3 cwm.txt  

133  2008-02-17
132  2007-08-11
取出第一列值来除重,也就是取第一个
适配的133的行
 
2.sort命令的功能是对文件中的各行进行排序
 
sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。
Sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。
语法:
sort [选项] 文件
说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“-”,则表示排序内容来自标准输入。sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

改变缺省设置的选项主要有:

- m 若给定文件已排好序,合并文件。

- c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出。

- u 对排序后认为相同的行只留其中一行。

- o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。

改变缺省排序规则的选项主要有:

- d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。

- f 将小写字母与大写字母同等对待。

- I 忽略非打印字符。

- M 作为月份比较:“JAN”<“FEB”

- r 按逆序输出排序结果。

+posl - pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。

- b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。

- t separator 指定字符separator作为字段分隔符。

例子:

[root@TestAs4 mdn]# more mdn_dishi.txt
1350000 510 51 广州
1350002 510 51 广州
1350004 540 51 深圳

[root@TestAs4 mdn]# sort -n -u -k 1 mdn_dishi.txt >chenwenming_mdn_d

#把文件mdn_dishi.txt第一字段以数字排序并除重

 

 

3. wc-----输出每个文件中的字符数、单词数及行数。
wc [options][files]

$ wc -l file  输出file中的行数
$ wc -w file  输出file中的单词数
$ wc -c file  输出file中的字符数
 
 
4. split-----把大文件分割成小文件(文本文件)
 
split  -l number(多少行)   old.txt(原文件)  ##-l安照多少行来分割文件 
split -b 1m  old.txt(原文件)  ##SIZE 值为每一输出档案的大小,单位为 byte。
 
 
 
 
 
5. awk 用法
 
例如:
awk -F: '{ print $1 }' /etc/passwd >txt    取第一列 以:为分界线

awk  '{ print $2 }' file   >txt    取第二列  以空格为分界线

[root@TestAs4 cwm]# awk '{print $1}' 133mdn.txt |uniq -c #给文件133mdn.txt第一个字段分组统计
   2336 七台河
   2033 伊春
   3331 佳木斯
   2530 双鸭山
  39811 哈尔滨
    845 大兴安岭
-----------------------------------------------------------------------------
awk处里两个文件连查方法

[root@TestAs4 cwm]# awk '{print $1,substr($1,1,7)}' hlj_jifei >hlj_temp
[root@TestAs4 mdn]# more hlj_temp
130097XX055 1300970
130097XX495 1300970

[root@TestAs4 mdn]# more  test1
1300019                 510             020     广州
1300101                 110             010     北京
1300103                 110             010     北京

[root@TestAs4 mdn]# awk  'NR==FNR{a[substr($1,1,7)]=$4}NR>FNR&&a[b=substr($1,1,7)]{print $1,a[b]}' test1 hlj_temp

[root@TestAs4 mdn]# awk  'NR==FNR{a[$1]=$4}NR>FNR&&a[b=substr($1,1,7)]{print $1,a[b]}' test1 hlj_temp
130097XX055 哈尔滨
130097XX495 哈尔滨
--------------------------------------------------------------------------------------
[root@TestAs4 mdn]# more temp
1300970 130097XX055
1300970 130097XX495
[root@TestAs4 mdn]# more awk_script
BEGIN { while ((getline < "test1") > 0){ lines[$1]=$4 };OFS=" " }
{
   if($1 in lines){
       $1=lines[$1]    #把test1文件的$4替换到temp文件的$1上
        print $0
   }

#要求把test1文件的第四个字段插入到temp文件的相应条目的第一个子段中
#利用getline获取test1文件的第四个字段,并且放到一个数组中。

[root@TestAs4 mdn]# ls
2  3  awk_script  cwm  hlj_jifei  hlj_temp  newmdn_table.TXT  temp  test1
[root@TestAs4 mdn]# awk -f awk_script  temp  |more
哈尔滨 130097XX055
哈尔滨 130097XX495