![并排打印两列中的两个文件](https://linux22.com/image/118053/%E5%B9%B6%E6%8E%92%E6%89%93%E5%8D%B0%E4%B8%A4%E5%88%97%E4%B8%AD%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我想在两列中输出两个文本文件 - 一列在左侧,另一列在右侧。
paste
并不能解决问题,因为它只插入一个字符作为分隔符,所以如果第一个文件具有不同长度的行,输出将被扭曲:
$ cat file1
looooooooong line
line
$ cat file2
hello
world
$ paste file1 file2
looooooooong line hello
line world
如果有一个命令添加尾随空格,那么fmt --add-spaces --width 50
问题就可以解决(1):
$ paste <(fmt --add-spaces --width 50 file1) file2
looooooooong line hello
line world
但我不知道有什么简单的方法可以做到这一点。
那么如何水平合并文件并将它们打印到标准输出而不扭曲呢?
事实上,我只是想并排阅读它们。
(1)更新:添加尾随空格的命令确实存在,例如xargs -d '\n' printf '%-50s\n'
.但是,当行数少于 时,运行
$ paste <(add-trailing-spaces file1) file2
不会产生预期的视觉输出。file1
file2
答案1
使用单个pr
命令:
pr -Tm file[12]
-T
(--omit-pagination
) - 省略页眉和页尾,通过输入文件中设置的换页消除任何分页-m
(--merge
) - 并行打印所有文件,每列一个
答案2
关于什么paste file{1,2}| column -s $'\t' -tn
?
looooooooong line line hello
line world
这表明
column
用作Tab
列的分隔符,我们从命令中获取它,paste
如果未指定,则该命令是默认的分隔符;一般来说:paste -d'X' file{1,2}| column -s $'X' -tn
其中
X
表示任何单个字符。您需要选择一个不会出现在您的文件中的选项。该
-t
选项用于确定输入包含的列数。- 这不会在两个文件之间添加长制表符,而其他答案则会添加长制表符。
即使 file1 中有空行,这也会起作用,并且不会在 file1 的打印区域中打印第二个文件,参见下面的输入/输出
输入文件1:
looooooooong line line
输入文件2:
hello world
输出:
looooooooong line hello world line
答案3
便携式解决方案:
$ paste file1 file2 | awk -F'\t' '{ printf("%-30s %s\n", $1, $2) }'
looooooooong line hello
line world
这用于paste
为 生成制表符分隔的输入awk
。
该awk
脚本仅采用两个制表符分隔的字段并使用 输出它们printf()
。为第一个文件保留 30 个字符的列。意思%-30s
是“字符串数据的 30 个位置左对齐”。删除-
将产生一个右对齐的列,更改30
将更改列宽。
它还处理不均匀长度的文件。我在第二个文件中添加了几行:
looooooooong line hello
line world
hello
world
hello
world
并且,当在命令行上反转文件的顺序时:
hello looooooooong line
world line
hello
world
hello
world
答案4
尝试:
paste -d '\n' file1 file2 | xargs -d '\n' printf '%-30s %-30s\n'
灵感来自@Kusalananda的解决方案。
注意:-d
的参数xargs
仅在 GNU 版本上可用,在 BSD 上不可用。