天真的逐行比较,如“comm -3”,但看起来像“diff -y”

天真的逐行比较,如“comm -3”,但看起来像“diff -y”

我正在寻找一些东西,它给了我两个排序输出的输出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 sizeor的输出stty -a。或者使用zsh -c 'echo $COLUMNS'(也适用于mksh)。没有标准/可移植的方式来获取该信息。

如果输入文件包含多字节或双角字符,则为 YMMV。根据expand/awk实现,对齐可能会关闭。

这还假设输入文件没有以制表符开头的行。如果不能保证这一点,GNU 实现comm有一个--output-delimiter可以用来指定唯一字符串的方法。或者您可以实现不应太复杂的comm功能。awk

相关内容