"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 size있습니다 stty -a. 또는 zsh -c 'echo $COLUMNS'( 에서도 작동 mksh)을 사용하세요. 이 정보를 얻을 수 있는 표준/이식 가능한 방법은 없습니다.

입력 파일에 멀티바이트 또는 이중 너비 문자가 포함된 경우 YMMV입니다. expand/ 구현 에 따라 awk정렬이 꺼질 수 있습니다.

또한 입력 파일에 탭 문자로 시작하는 행이 없다고 가정합니다. 이것이 보장될 수 없는 경우 GNU 구현에는 고유한 문자열을 지정하는 데 사용할 수 있는 메서드가 comm있습니다 . 또는 --output-delimiter너무 복잡하지 않은 comm기능을 구현할 수도 있습니다.awk

관련 정보