有几种工具用来处理文本文件分类、合并和分割操作
sort、uniq、join、cut、paste、split
一、sort
1、简介:sort将文件的每一行作为一个单位相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
2、参数:
-u:排序时,去除重复的记录
-r:降序排列,默认为升序
-o:将排序后的结果,重写回原文件
sort -r a.txt -o a.txt
备注:如果直接用重定向,如sort -r a.txt > a.txt 此时会将原文件清空
-n:以数值进行排序,否则会导致10<2的情况发生
-t、-k:有文件a.txt,内容如下:
a:1:A
b:2:B
c:3:C
如果想按第二列进行排序,则可以这样写:
sort -k 2 -t: a.txt ->-t:表示分隔符为: , -k 2:表示以第2列为依据进行排序
-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写
-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1
-M会以月份来排序,比如JAN小于FEB等等
-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。
3、例子a.txt
a
bc
ba
sort a.txt ->
a
ba
bc
二、uniq
1、简介:主要用于显示唯一行,对于那些有连续重复的行只显示一次
2、参数:
不带参数:对于连续重复的行,只显示一行
-c :显示文件中每行连续出现的次数。
-d :仅显示文件中连续重复出现的行,且只显示一次
-D :仅显示文件中连续重复出现的行,且重复的行全部显示
-u :显示文件中没有连续出现的行
-i :不区分大小写
3、例子
文件a.txt,内容如下:
hello world
hello world
HEllo WorLd
nihao
nihao
hello world
a.不带参数 uniq a.txt ->
hello world
HEllo WorLd
nihao
hello world
b.-c uniq -c a.txt ->
2 hello world
1 HEllo WorLd
2 nihao
1 hello world
c.-d uniq -d a.txt ->
hello world
nihao
d.-u uniq -u a.txt ->
HEllo WorLd
hello world
f.-i uniq -f a.txt ->
hello world
nihao
hello world
三、join
1、简介:join将两个分类文件的行连接在一起
2、参数
-an :n为数字,用于连接时从文件n中显示不匹配行,例如,a1显示第一个文件的不匹配
行,-a2为从第二个文件中显示不匹配行 <用于无联系的多个表>
-o n.m n为文件号,m为域号,如1.3表示只显示文件1第三域;需用逗号隔开 <用于显示有相同域的多个表>
-j n m n为文件号,m为域号,使用其他域做连接域 <用于有相同域的多个表,在连接时,指定对应的域>
-t 域分割号,用来设置除空格,tab键之外的分隔符,如-t:
3、例子
有如下两个文件1.txt 2.txt,内容分别如下:
---匹配连接
1.txt 内容如下:
zj 110
zw 120
2.txt 内容如下:
zj sichuan
zw helongjiang
join 1.txt 2.txt ->
zj 110 sichuan
zw 120 helongjiang
---选择性连接(-o) --有相同域
join -o 1.1,2.2 1.txt 2.txt ->
zj 110
zw 120
---不匹配连接(-a) --无相同域
1.txt 内容如下:
zj 110
zw 120
2.txt 内容如下:
azj sichuan
azw helongjiang
join 1.txt 2.txt ->内容为空
join -a1 1.txt 2.txt ->
zj 110
zw 120
join -a2 1.txt 2.txt ->
azj sichuan
azw helongjiang
join -a1 -a2 1.txt 2.txt ->
azj sichuan
azw helongjiang
zj 110
zw 120
---手动选择连接域(-j) --有相同域
1.txt
110 zj a
120 zw b
2.txt
dongguan A zj
helongjiang B zw
join -j1 2 -j2 3 1.txt 2.txt ->
zj 110 a dongguan A
zw 120 b helongjiang B
四、cut
1、简介:cut用来从标准输入或文本文件中剪切列或域
2、参数
-c 指定剪切字符数 --该参数常用在固定长度的域或文件名上
-f 指定剪切域数
-d 指定域分隔符,除空格、Tab键
3、例子
文件pers.txt,内容如下:
P.Jones:office Runner:ID897
S.Round:UNIX:ID666
L.Clip:Personl Chief:ID982
cut -d: -f3 pers.txt ->表示域分隔符为:抽取第3个域
ID897
ID666
ID982
cut -d: -f1,3 a.txt ->抽取第1、3两个域
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
cut -d: -f2-3 a.txt ->抽取2-3两个域
office Runner:ID897
UNIX:ID666
Personl Chief:ID982
cut -d: -f1 /etc/passwd ->获取该系统已注册的用户
假设该pers.txt的ls -l如下:
-rw-r----- 1 root root 73 Sep 14 10:14 a.txt
现在我们使用-c参数抽取权限位: ls -l | cut -c1-10 ->
-rw-r-----
五、paste
1、简介:cut用来从文本文件或标准输出中抽取数据列或域,然后再用paste可以将这些数据粘贴
起来形成相关文件,粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。
该命令按行将不同文件行信息放在一起,默认情况,paste连接时,
用空格或tab键分割新行中不同文本,除非指定-d选项
paste -d -s -file1 file2
2、参数
-d :指定分割符,除空格和Tab键
-s :将每个文件合并成行,而不是按行粘贴,也就是一个文件内容占一行
- :使用标准输入
3、例子
文件pers.txt,内容如下:
P.Jones:office Runner:ID897
S.Round:UNIX:ID666
L.Clip:Personl Chief:ID982
通过cut -d: -f2 a.txt > 2.txt,生成2.txt,内容如下:
office Runner
UNIX
Personl Chief
通过cut -d: -f3 a.txt > 3.txt,生成3.txt,内容如下:
ID897
ID666
ID982
--------
现通过paste命令,将两个文件进行合并
a. 指定列
paste 3.txt 2.txt ->
ID897 office Runner
ID666 UNIX
ID982 Personl Chief
b. 使用不同的域分隔符
paste -d# 3.txt 2.txt ->
ID897#office Runner
ID666#UNIX
ID982#Personl Chief
c. 将每个文件合并成行
paste -s 3.txt 2.txt ->
ID897 ID666 ID982
office Runner UNIX Personl Chief
d. 将指定格式显示
假设当前目录有以下三个文件a.txt 1.txt 2.txt
ls | paste -d" " - ->这里的-代表一样只显示一个文件
1.txt
2.txt
a.txt
ls | paste -d"#" - - ->每行显示两个文件,且每个文件之间以#分割
1.txt#1.txt
a.txt#
六、split
1、简介:在传送超大文件时,有时需要将文件分割成小的文件,方便传送
2、参数
格式:split -out_file_size file_name
-out_file_size:默认情况,该值为1000行,也就是不指定参数将默认以1000行为单位形成一个新的文件
3、例子
有如下文件split.txt,内容如下:
a
b
c
d
1
2
--------
split -2 split.txt ->将以每2行,分割成新的文件,结果如下:
-rw-r----- 1 root root 4 Sep 14 11:46 xaa
-rw-r----- 1 root root 4 Sep 14 11:46 xab
-rw-r----- 1 root root 4 Sep 14 11:46 xac
IMAPM2000:/opt/zj/split # cat xaa
a
b
IMAPM2000:/opt/zj/split # cat xab
c
d
IMAPM2000:/opt/zj/split # cat xac
1
2