Linux常用命令--文本分割相关命令

摘要

  • 文本分割合并等相关命令,如tr、cut、paste和split等等

  • 本文基于CentOS8(x86_64)

tr

  • tr用来从标准输入中替换、缩减和删除字符,并将结果写到标准输出

  • 语法

1
tr [选项]... SET1 [SET2]
  • 示例

1
2
3
4
5
6
7
cat file | tr 'do' 'hp' : 将file中内容为do替换为hp,替换内容与换内容长度一致
cat file | tr 'do' 'hpa' : 将file中内容为do替换为hp,多出的a会内忽略
cat file | tr 'doABC' 'hp' : 将file中内容为do替换为hp,ABC都是用替换内容的最后一个字符p进行替换,即doABC替换为hpppp
cat file | tr "a-z" "A-Z" : 将小写字符替换为大写字符
cat file | tr "\t" "$" : 支持转义字符,这里将tab替换为$
cat file | tr -d 'do' : 将file中内容为do的内容删除
cat file | tr -s 'a-z' : 去除file中重复的小写字符,只保留第一个

cut

  • cut命令可以用于分隔每行的内容

  • 语法

1
cut [选项]... [文件]...
  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 以空格作为分隔符,打印第一组
cut -d " " -f1 file
-d:分隔符,按照指定分隔符分割列。与 -f 一起使用
-f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思(列号,提取第几列)

# 以;作为分隔符,打印第二组和第三组,注意打印多组时,分隔符也会打印
cut -d ";" -f2,3 file

# 从file文件中取出每行的第5~8个字符
cut -c 5-8 file
-c : 以字符 (characters) 的单位取出固定字符区间,可以用来分割中文

# 从file文件中取出每行的第2,4,6个字节
cut -b 2,4,6 file
-b : 以字节为单位进行分割

# 从file文件中取出每行的第6个字节之前的内容
cut -b -6 file
# 从file文件中取出每行的第3,第4、第5和第8个字节,数字定位的顺序必须由小到大
cut -b 3-5,8 file

# 如果使用-b提取中文,如果提取到的不是一个完整的中文字符所占的字节,就会出现乱码
# 比如在utf8编码下,一个中文占3个字节
cut -b 1 file : 此时中文字符会出现乱码
# 如果希望中文也能完整的提取,可以加上 -n
cut -nb 1 file

paste

  • 将多个文件的相应行用制表符连接起来,并输出到标准输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ cat p1.txt
1
2
3
$ cat p2.txt
zhangsan
lisi
wangwu

# 默认分隔符为制表符
$ paste p1.txt p2.txt
1 zhangsan
2 lisi
3 wangwu

# 指定逗号为分隔符
$ paste -d "," p1.txt p2.txt
1,zhangsan
2,lisi
3,wangwu

# 每个文件的内容作为一行
$ paste -s -d "," p1.txt p2.txt
1,2,3
zhangsan,lisi,wangwu

split

  • split命令用于将一个文件分割成数个。该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。默认前缀为“x”。没有输入,或者当输入为-,则读取标准输入。

  • 语法

1
split [选项]... [输入 [前缀]]
  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 分割为1000行的小文件,文件名格式xaa,xab...
split file

#prefix指定分割后的文件前缀,默认为x
split file prefix

# 分割为指定行数的文件,如100行
split -l 100 file

# 分割为500M大小的文件
split -b 500M file

# 指定分割后小文件名后缀
split --additional-suffix=.log file

# 使用数字代替字符文件名,分割后的文件名为x00,x01...的数字形式
split -d file

# 指定分割后小文件名前缀后跟的文件名长度(不含前缀和后缀),默认长度为2,这里文件名格式为xaaa.log,xaab.log...
# 当分割后文件的数量大于文件名能表达的最大文件数时,会报错
split -a 3 --additional-suffix=.log file

# 将分割后的文件合并,如文件名格式为xaaa.log,xaab.log
cat x*.log > newfile
  • 实战
    使用split数字命名时,序号是从0开始的,如果希望从1开始,可以使用如下方法:

1
2
3
4
# 拆分为每100行一个文件,5位数字序号命名,文件名称为: x00000,x00001 ...
split -a 5 -d -l 100 content.txt
# 将每个文件名称中的数字加1后重新命名为: new00001,new00002 ...
ls -1 | grep ^x | awk -F 'x' '{d=sprintf("%05d" ,$2+1);system("mv "$0" new"d)}'