我正在寻找一些东西,它给了我两个排序输出的输出comm -3
(逐行比较,只有两侧的附加/缺失行),但看起来更像 的输出diff -y
,例如,因为它使用整个宽度。
file1
:
bar/a
bar/feugiat
bar/libero
bar/mauris
bar/scelerisque
bar/urna
foo/blandit
foo/elementum
foo/feugiat
foo/laoreet
foo/luctus
foo/non
foo/pellentesque
foo/pulvinar
foo/rutrum
foo/sed
foo/ut
foo/vivamus
file2
:
bar/a
bar/molestie
bar/quam
bar/risus
bar/tristique
foo/blandit
foo/elementum
foo/feugiat
foo/ligula
foo/massa
foo/mauris
foo/metus
foo/pellentesque
foo/pulvinar
foo/ut
输出来自comm -3 file1 file2
:
bar/feugiat
bar/libero
bar/mauris
bar/molestie
bar/quam
bar/risus
bar/scelerisque
bar/tristique
bar/urna
foo/laoreet
foo/ligula
foo/luctus
foo/massa
foo/mauris
foo/metus
foo/non
foo/rutrum
foo/sed
foo/vivamus
(GNU)的输出diff -y --suppress-common-lines file1 file2
,取决于屏幕宽度:
bar/feugiat | bar/molestie
bar/libero | bar/quam
bar/mauris | bar/risus
bar/scelerisque | bar/tristique
bar/urna <
foo/laoreet | foo/ligula
foo/luctus | foo/massa
foo/non | foo/mauris
> foo/metus
foo/rutrum / foo/ut
foo/sed <
foo/ut <
foo/vivamus <
我希望的可能输出:
bar/feugiat <
bar/libero <
bar/mauris <
> bar/molestie
> bar/quam
> bar/risus
bar/scelerisque <
> bar/tristique
bar/urna <
foo/laoreet <
> foo/ligula
foo/luctus <
> foo/massa
> foo/mauris
> foo/metus
foo/non <
foo/rutrum <
foo/sed <
foo/vivamus <
没有箭头也可以,只是应该更好地使用屏幕宽度:
bar/feugiat
bar/libero
bar/mauris
bar/molestie
bar/quam
bar/risus
bar/scelerisque
bar/tristique
bar/urna
foo/laoreet
foo/ligula
foo/luctus
foo/massa
foo/mauris
foo/metus
foo/non
foo/rutrum
foo/sed
foo/vivamus
答案1
您可以通过管道传输到:
expand -t "$((${COLUMNS:-$(tput cols)} / 2))"
或者对于尖括号:
awk -v cols="${COLUMNS:-$(tput cols)}" '
BEGIN {width = cols/2-1; space = sprintf("%*s", width, "")}
/^\t/ {print space ">", substr($0, 2); next}
{printf "%-*s<\n", width, $0}'
如果您tput
没有输出列数,您可以尝试解析stty size
or的输出stty -a
。或者使用zsh -c 'echo $COLUMNS'
(也适用于mksh
)。没有标准/可移植的方式来获取该信息。
如果输入文件包含多字节或双角字符,则为 YMMV。根据expand
/awk
实现,对齐可能会关闭。
这还假设输入文件没有以制表符开头的行。如果不能保证这一点,GNU 实现comm
有一个--output-delimiter
可以用来指定唯一字符串的方法。或者您可以实现不应太复杂的comm
功能。awk