2016-06-08 1 views
0
declare -a array1=(1 2 3 4 5 6 7 8 9 10 11 12) 
declare -a array2=(1 2 3 5 6 7 9 10 11 12) 

array2`? 위의 예에서, 예상되는 출력 mapfile, comm, sort 공정 교체와 (4 8)어떤 값을 찾기`array1`가 누락되는`내가 <code>array2</code>에서 <code>array1</code>에 존재하지만 결석 값의 세 번째 배열을 얻을 수있는 방법, 떠들썩한 파티에서

+0

@andlrc. 감사. 명령 대체가 무엇인지는 아직 이해하지 못했습니다 (그러나 질문을 조사 할 것입니다). 먼저 배열을 올바르게 정의하도록 변경했습니다. –

+0

@ Remi.b이 작업을 수행하는 이유는 무엇입니까? 이것은 쉘 스크립팅의 목적이 아닙니다. 원인은있을 수 있지만 특정 목표를 염두에두고 있습니까? – andlrc

답변

1

이다

array1=(1 2 3 4 5 6 7 8 9 10 11 12) 
array2=(1 2 3 5 6 7 9 10 11 12) 
mapfile -t arr < <(comm -23 --nocheck-order \ 
         <(printf "%s\n" "${array1[@]}" | sort -n) \ 
         <(printf "%s\n" "${array2[@]}" | sort -n)) 

결과 :

: 안쪽에서 바깥

$ declare -p arr 
declare -a arr='([0]="4" [1]="8")' 

해설

  • Pr

    $ printf "%s\n" "${array1[@]}" | sort -n 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 
    11 
    12 
    

    array2 대해 동일한 : 정렬 라인 당 하나의 요소 어레이에서 INT.

  • comm의 인수로 처리로 대체 이러한 파이프 싸서 사용

    comm -23 --nocheck-order \ 
        <(printf "%s\n" "${array1[@]}" | sort -n) \ 
        <(printf "%s\n" "${array2[@]}" | sort -n) 
    

    -23 첫번째 배열 고유 값으로 결과를 감소시킨다; --nocheck-order은 사전 식으로 정렬되지 않은 입력에 대한 경고를 표시하지 않습니다. 이것의 출력은 (-t는 개행 제거) mapfile와 배열 요소에 각각의 라인을 읽고

    4 
    8 
    
  • 이다

    mapfile -t arr < <(comm -23 --nocheck-order \ 
            <(printf "%s\n" "${array1[@]}" | sort -n) \ 
            <(printf "%s\n" "${array2[@]}" | sort -n)) 
    

    지금, arr 같이 두 값을 포함하는 전술 한 바와.

단계단계는 반드시 필요한 것은 아니지만 정렬되지 않은 배열에 대해서도 솔루션을 작동하게합니다.

+1

IFS + echo 구조 대신에'printf "% s \ n" "$ {array1 [@]}"'을 사용할 수 있습니다. 이 예제에서'$ {array1 [*]} ''대신'$ {array1 [@]}''를 사용하면'printf' 변형과 관련됩니다; '*'를 사용하면'printf'에 인수로 전달 된 단일 문자열을 얻습니다. –

+0

@JonathanLeffler 그건 사실 더 우아합니다. "$ {array1 [@]}"대신에 $ {array1 [*]} "'은 내 변형에서도 중요합니다. 그렇지 않으면'IFS'는 배열 요소를 분리하는 데 사용되지 않습니다. 우주. –

1

onliner이 트릭을 할 것입니다 다음은

diff -y <(printf '%s\n' "${array2[@]}") <(printf '%s\n' "${array1[@]}") | grep -Po '[\|\<\>][\t]\K[0-9]+$' 

printf은 별도의 라인의 요소를 인쇄하는 데 사용됩니다.

1   1  
2   2 
3   3 
5   | 4 
6   5 
7   6 
9   7 
10  | 8 
11   9 
12   10 
      11 
      12 

이제 모든 사용자가 | (또는 때때로 < 또는 >) 후 번호를 필터링 할 수 있습니다 이제 diff -y 출력을 제공합니다. 이 경우 grep을 사용했지만 sed도 사용할 수 있습니다. 배열이 정렬되지 않은 경우 printf에 다음과 같이 정렬을 추가하면됩니다.

(printf '%s\n' "${arrayN[@]}"|sort -n) 
관련 문제