Cut、paste 和 join
让我们看看另外三个命令,它们可以处理文本数据中的字段。这些命令对于处理表格表数据尤其有用。第一个是 cut 命令,它可以从文本文件中提取字段。默认的字段分隔符是制表符。清单 16 使用 cut 来分隔 text2 中的两个列,然后使用空格作为输出分隔符,这是一种将每行中的制表符替换为空格的好方法。
清单 16. 使用 cut
[ian@echidna lpi103-2]$ cut -f1-2 --output-delimiter=' ' text2 9 plum 3 banana 10 apple
paste 命令可以并行粘帖来自两个或多个文件的行,其方式类似于 pr 命令使用其 -m 选项合并文件。清单 17 展示了粘帖两个文本文件的结果。
清单 17. 粘帖文件
[ian@echidna lpi103-2]$ paste text1 text2 1 apple 9 plum 2 pear 3 banana 3 banana 10 apple
这些例子展会了比较简单的粘帖,但是 paste 可以使用多种其他方式粘帖来自一个或多个文件的数据。请参考手册页获得详细信息。
最后一个字段操作命令为 join,它将根据匹配的字段连接文件。这些文件应当根据 join 字段排序。由于 text2 并不是按数值排序的,因此可以对它进行排序并使用 join 命令将具有匹配的 join 字段(在本例中指值为 3 的字段)的两行连接起来。
清单 18. 使用 join 字段连接文件
[ian@echidna lpi103-2]$ sort -n text2|join -j 1 text1 - 3 banana banana join: file 2 is not in sorted order
哪里出错了?回忆一下 Sort 和 uniq 小节中介绍的字符和数值排序。将根据 locale 的排序序列对匹配的字符执行 join 命令。它不会对数值字段生效,除非这些字段具有一致的长度。
我们使用 -j 1 选项连接每个文件的字段 1。用于 join 的字段可能会针对每个文件进行单独指定。比如,在执行连接时,可以对某个文件使用字段 3,而对另一个文件使用字段 10。
让我们根据第二个字段(水果名)对 text 1 进行排序,从而生成一个新文件 text5,然后使用制表符替换空格。如果我们针对 text2 的第二个字段对其排序,然后使用每个文件的第二个字段作为 join 字段来将 text2 和 text5 连接起来,那么我们应该得到两个匹配(apple 和 banana)。清单 19 解释了这一连接。
清单 19. 使用 join 字段连接文件
[ian@echidna lpi103-2]$ sort -k2 text1|tr ' ' '\t'>text5 [ian@echidna lpi103-2]$ sort -k2 text2 | join -1 2 -2 2 text5 - apple 1 10 banana 3 3