Linux命令之 - paste

1. 简介

paste 命令用于合并文件中的行。将每个文件中按顺序对应的行(由制表符分隔)写入标准输出。如果没有文件,或者当文件为 - 时,读取标准输入。

2. 用法及选项

2.1 用法

paste [OPTION]… [FILE]…

2.2 选项

  • -d DELIM-LIST , –delimiters=DELIM-LIST

    使用该选项指定的字符(集合)DELIM-LIST 中的字符(序列)代替制表符 \t 作为输出中分割各个输入文件的行的分隔符 。

    DELIM-LIST 为单个字符,则这个字符将作为输出中分隔各个文件的行的分隔符;

    DELIM-LIST 为一组字符序列,则字符序列中的各个字符将作为输出中对应的各个文件的行之间的分隔符。当 DELIM-LIST 中字符序列中的字符数小于指定的输入文件的个数减 1 时,将循环使用 DELIM-LIST 中的字符作为分隔符。例如,当指定四个输入文件,但是指定的分隔符序列为 :-,则输出中四个输入文件内容之间的三个分隔符分别为:-:

  • -s

    一次粘贴一个文件,而不是并行的粘贴。

    也就是说,把每个输入文件中的所有的行使用分隔符连接,然后作为输出中的每一行。

3. 使用示例

有两个文件,内容如下:

$ cat num
1 2
3 4
5 6
$ cat letter 
a b c
d e f
g h i
j k 

下面的例子将使用这两个文件。

3.1 不使用任何选项

不使用任何选项的情况下,paste 命令将把所有输入文件(包括标准输入)的内容按照对应的行拼接在一起并输出,输出中使用默认的分隔符(制表符)连接各个输入文件中对应的行。

$ paste num letter 
1 2     a b c
3 4     d e f
5 6     g h i
        j k 

也可以同时指定多次指定一个文件:

$ paste num letter num
1 2     a b c   1 2
3 4     d e f   3 4
5 6     g h i   5 6
        j k 

将文件及标准输入中的行合并输出,

$ paste num - < letter 
1 2     a b c
3 4     d e f
5 6     g h i
        j k 
# '- < letter' 表示将文本文件 letter 的内容重定向到标准输入,一个 `-` 表示重定向到一个文件
$ paste num - - < letter
1 2     a b c   d e f
3 4     g h i   j k 
5 6
# '- - < letter' 表示将文本文件 letter 的内容重定向到标准输入,两个 `-` 表示重定向到两个文件,letter 文件
# 的内容将会按行循环分配给两个文件

理解了上面 - 的用法,那么下面的例子就不难理解了,即将 seq 命令的输入重定向到两个文件(标准输入),

$ seq 4 | paste - -
1       2
3       4

也可以重定向到三个文件:

$ seq 4 | paste - - -
1       2       3
4

3.2 指定分隔符(序列)

可以通过 -d 选项指定一个字符或者一个字符序列作为一个或者一组分隔符。

合并两个文件的内容,并指定空格作为分隔符:

$ paste -d ' ' num letter 
1 2 a b c
3 4 d e f
5 6 g h i
 j k 

合并文件的行并重复文件 num2 的内容,且指定字符序列 :- 作为一组分隔符:

$ paste -d ':-' num letter num
1 2:a b c-1 2
3 4:d e f-3 4
5 6:g h i-5 6
:j k -
# 其中第一个文件 num 的行和第二个文件 letter 对应的行使用分隔符序列中的第一个字符 ':' 作为分隔符;
# 第二个文件 letter 的行和第三个文件 letter 对应的行使用分隔符序列中的第二个字符 '-' 作为分隔符;

指定四个输入文件,但是只指定 2 个分隔符,则将会循环使用指定的分隔符序列中的分隔符:

$ paste -d ':-' num letter num letter
1 2:a b c-1 2:a b c
3 4:d e f-3 4:d e f
5 6:g h i-5 6:g h i
:j k -:j k 
# 其中第一个文件 num 的行和第二个文件 letter 对应的行使用分隔符序列中的第一个字符 ':' 作为分隔符;
# 第二个文件 letter 的行和第三个文件 letter 对应的行使用分隔符序列中的第二个字符 '-' 作为分隔符;
# 由于分隔符序列中已经没有第三个字符,所以又使用分隔符序列中的第一个字符作为第三个文件 num 和第四个
# 文件 letter 对应的行的分隔符。若还有第五个文件,那么将使用分隔符序列中的第二个字符作为分隔符,以此类推

3.3 保持文件内容(行)的完整性

在不使用 -s 选项的情况下,每个输入文件的行将会被分配到输出中的多个行中。使用 -s 选项可以使得每个输入文件中的所有的行使用分隔符连接,然后作为输出中的完整的一行。

$ paste -s num letter
1 2     3 4     5 6
a b c   d e f   g h i   j k 
$ paste -s -d ' ' num letter
1 2 3 4 5 6
a b c d e f g h i j k 

3.4 使用 paste 命令编写一个行转列的脚本

#!/bin/bash
# filename: convert.sh
# convert row to column

rows=`cat $1 | wc -l`
for (( i=1; i<=$rows; i++)); do
    sed -n ${i}p $1 | xargs -n1 > /tmp/$1_$i
done
paste /tmp/$1_*
rm /tmp/$1_*

有一个员工信息的文件 info.txt:

$ cat info.txt
Name    Age     Gender  Dept
bob     24      male    SQA
alex    28      male    R&D
lucy    22      female  HR

使用上述脚本将其尽心转换:

$ sh convert.sh info.txt
Name    bob     alex    lucy
Age     24      28      22
Gender  male    male    female
Dept    SQA     R&D     HR

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值