Diff

幼稚的逐行比較,如“comm -3”,但看起來像“diff -y”

  • February 24, 2017

我正在尋找一些東西,它給了我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

您可以通過管道傳輸到:

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實現對齊可能會關閉。

這也假設輸入文件沒有以 Tab 字元開頭的行。如果不能保證,GNU 實現comm有一個--output-delimiter你可以用來指定唯一字元串的。或者您可以實現不應該太複雜的comm功能。awk

引用自:https://unix.stackexchange.com/questions/347323