Linux 命令 - cut, paste, split, cat, join

1 命令简介

cut 命令用于打印出一个文件中指定的某几个域,或某几个字符,或某几个字节。

paste 却恰好相反,它是用来将多个文件中的内容并列打印,或横排打印。

split 命令用以将一个文件按字节或者按行分割成多个小文件。

cat 命令则相反,它将多个文件连接在一起并打印。

join 命令会根据指定的域对两个文件进行匹配,并对匹配的域合并在一起并打印。

2 cut 命令

2.1 按字节打印

打印每行的第 n 个字节:
cut -b n filename

打印每行的第 1-n 这个范围内的字节:
cut -b -n filename

打印每行的第 n-末位这个范围内的字节:
cut -b n- filename

打印每行的第 m-n 这个范围内的字节:
cut -b m-n filename

打印多个范围内的字节:
cut -b m-n,q-p filename

逗号两边不能有空格。
另外,cut 命令在打印前,会将多个范围的字节编号按从小到大进行排序,如果有重复的字节编号,则会自动过滤掉,保留其中一个。

2.2 按字符打印

打印每行的第 n 个字符:
cut -c n filename

其他情况同上。

当存在 UTF-8 这种多字节字符编码时,-c 和 -b 结果明显不同。

2.3 按域打印

首先,cut 命令默认以 制表符 为一个分隔符。如果要自定义分隔符,可以用 -d 指定:
cut -d '分隔符'

分隔符只能为一个字符,不能是多个字符。

然后就可以用 -f 参数指定具体需要打印的域了。

打印每行的第 n 个域:
cut -f n filename

3 paste 命令

3.1 paste 的一般用法

paste filename1 filename2 filename 3

将多个文件并列打印。具体地,每行有多个域,每个域对应一个文件中相应行的内容。任意两个域之间默认都用一个 制表符 隔开。

如果某一行中,某个文件没有相应内容,则相应域为一个空串。

3.2 指定分隔符

paste -d '分隔符' filename1 filename2 filename3

分隔符只能为一个字符,不能为多个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat filename1
tsinghua
peking
nju
cat filename2
1
2
3
paste -d ':' filename1 filename2
tsinghua:1
peking:2
nju:3

3.3 横排打印

默认情况下,paste 都是对文件并列打印。也可以横排打印,也就是说打印出的一行中的内容为一个文件中的所有行(先打印完一个文件中的所有行到一行中,再打印另外一个文件中的所有行到下一行中):
paste -s -d '分隔符' filename1 filename2 filename3

1
2
3
4
5
6
7
8
9
10
11
12
13
cat filename1
tsinghua
peking
nju
cat filename2
1
2
3
paste -s -d ':' filename1 filename2
tsinghua:peking:nju
1:2:3

4 split 命令

4.1 按字节分割成多个文件

split -b m -a p -d --additional-suffix='额外的后缀字符串' filename output

其中:

  • -b 指定字节数,可以为一个数字,也可以是带有单位的值,比如 20M。单位有 K, M, G, T, P, E, Z, Y
  • -a 指定分割成的子文件的文件名的后缀的长度。默认情况下后缀为 [a-z] 的字符串。长度为 2 的字母字符串后缀分别为 aa, ab, ac, …。
    也可以指定为数字字符串,只需要另外加上 -d 参数即可。数字字符串中每个字符以 0 开始。比如长度为 2 的数字字符串后缀为 00, 01, 02, …。
  • –additional-suffix 指定额外的字符串,也即在上面 -a 指定长度的字符串后面的额外的字符串。
  • output 为所分割成的子文件的文件名的前缀。

4.2 按行数分割成多个文件

split -l m -a p -d --additional-suffix='额外的后缀字符串' filename output

-l 指定行数,其他参数同上。

4.3 根据指定的一行最多字节数分割成多个文件

split -C m -a p -d --additional-suffix='额外的后缀字符串' filename output

指定 -C 参数表示,首先按照其指定的字节数进行分割。如果一行中待分割部分的长度小于指定的字节数,则也会进行分割。

总之,就是一行可能会分割到多个子文件中。

其他参数同上。

5 cat 命令

5.1 一般用法

将多个文件连接在一起并打印。其中,一个文件连接到前一个文件的尾部:
cat filename1 filename2 filename3

5.2 显示行号

连接并打印文件,同时显示所有行的行号(以 1 开始):
cat -n filename1 filename2 filename3

如果只显示非空白行的行号,则指定 -b 参数:
cat -nb filename1 filename2 filename3

6 join 命令

6.1 左连接

join -a 1 -t '分隔符' -1 m -2 n filename1 filename2

其中,

  • -a 指定文件编号(只能为 1 或 2)。命令行中第一个文件的编号为 1,第二文件的编号为 2。
    如果不指定,则表示进行 内连接。只会打印出匹配并合并后的行。
    如果指定为 1,则表示进行 左连接。除了会打印出第一个文件中匹配并合并后的行外,还会打印出第一个文件中不匹配的行。
    如果指定为 2,则表示进行 右连接。除了会打印出第二个文件中匹配并合并后的行外,还会打印出第二个文件中不匹配的行。
    如果既指定为 1,也指定为 2,则表示进行 全连接。除了会打印出两个文件中匹配并合并后的行外,还会打印出第一个文件和第二个文件中不匹配的行。
  • -t 指定分隔符,用于将输入文件中的一行分隔成多个域,也用于间隔打印的行中任意两个相邻的域。只能为一个字符,不能为多个字符。
  • -1 是一个参数,它用于指定需要进行匹配的第一个文件中的域的编号。
  • -2 是一个参数,它用于指定需要进行匹配的第二个文件中的域的编号。
  • 在打印合并后的内容的过程中,会先打印匹配的域,然后分别打印第一个文件和第二个文件中的剩余部分。

将 -a 指定为 1 表示进行左连接。

6.2 右连接

join -a 2 -1 m -2 n filename1 filename2

将 -a 指定为 2 表示进行右连接。

6.3 内连接

join -1 m -2 n filename1 filename2

如果不指定,则表示进行内连接。

6.4 全连接

join -a 1 -a 2 -1 m -2 n filename1 filename2

如果既将 -a 指定为 1,也将 -a 指定为 2,则表示进行全连接。


Reference