web-dev-qa-db-ja.com

「comm-3」のような単純な行ごとの比較ですが、「diff-y」のように見えます

私は、2つのソートされた出力(行ごとの比較、いずれかの側からの追加/欠落行のみ)で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

diff -y --suppress-common-lines file1 file2(GNU)からの出力、画面幅によって異なります。

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
3
phk

次の場所にパイプできます。

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またはstty -aの出力を解析してみてください。または、zsh -c 'echo $COLUMNS'を使用します(mkshでも機能します)。その情報を取得するための標準的/ポータブルな方法はありません。

入力ファイルにマルチバイト文字または倍幅文字が含まれている場合は、YMMV。 expand/awkの実装によっては、アライメントがオフになっている場合があります。

また、入力ファイルにタブ文字で始まる行がないことも前提としています。それが保証できない場合は、GNU commの実装には--output-delimiterがあり、これを使用して一意の文字列を指定できます。または、comm機能をawkに実装することもできます。複雑すぎないでください。

5