Diff
幼稚的逐行比較,如“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
來自
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 size
or的輸出stty -a
。或使用zsh -c 'echo $COLUMNS'
(也適用於mksh
)。沒有標準/便攜的方式來獲取該資訊。如果輸入文件包含多字節或雙角字元,則為 YMMV。根據
expand
/awk
實現對齊可能會關閉。這也假設輸入文件沒有以 Tab 字元開頭的行。如果不能保證,GNU 實現
comm
有一個--output-delimiter
你可以用來指定唯一字元串的。或者您可以實現不應該太複雜的comm
功能。awk