2016-06-15 3 views
0

나는 1 2 3 5 6 11 18이라고 가정하고 grep을 사용하여 파일에서 몇 자릿수를 추출했습니다. 누락 된 파일을 1..20에 가져 오려면 파일에 넣고 comm을 사용하여 비교하십시오.시퀀스에서 누락 된 자릿수를 추출합니다.

1 
10 
    11 
12 
13 
14 
15 
16 
17 
    18 
19 
    2 
20 
    3 
4 
    5 
    6 
7 
8 
9 

를 출력

a='1 2 3 5 6 11 18' 
printf '%d\n' $a | sort -u > 111 
printf '%d\n' {1..20} | sort -u > 222 
comm 111 222 
rm 111 222 

파일에 저장하지 않고 더 편리한 방법이 있나요?

+0

[처리 대체] (http://mywiki.wooledge.org/ProcessSubstitution) :'comm <(printf '% d \ n'$ a | sort -u) <(printf '% d \ n'{1 ..20})'참고 : 두 번째 경우'{1..20}'에 대해서는 정렬 할 필요가 없습니다. 그들은 이미 분류되어 있습니다. – anishsane

+0

^^ 그렇게 말하면서, 순수한 bash 변종을 쉽게 작성할 수 있습니다 :'a = '1 2 3 5 6 11 18'; $ a에서 x에 대해; do [$ x] = 1; 끝난; for ((x = 1; x <= 20; x ++)); do ((t [i])) || echo $ i; done' – anishsane

+0

감사합니다. @anishsane. 그러나 두 번째 것은 널 라인을 출력합니다. 첫 번째 것은'정렬 '이 필요합니다. '1 2 3 4 ... 10 ... 20'은 정렬 된 것으로 간주되지 않지만 '1 10 11 ... 2 20 3 ...'은 정렬됩니다. – Lee

답변

3

당신은 일하지만 20에서 숫자를 반복 한 다음 a에 대해 각 숫자를 비교하는 정규식을 사용할 수 있습니다

a='1 2 3 5 6 11 18' 
for i in {1..20}; do 
    re="\\b$i\\b" 
    [[ "$a" =~ $re ]] || echo "$i" 
done 

정규식은 매우 간단합니다 : \bword boundary이며, $i가 확대됩니다 1, 2, ..., 20

위의 내용은 a에없는 모든 숫자를 인쇄합니다.

+0

안녕하세요 @andlrc 작동하지만 왜 두 개의 백 슬래시가 하나가 아닌지 전혀 모른다. 그리고 왜 [[ "$"= ~ "\\ b $ i \\ b"]] || echo "$ i"'does not work – Lee

+1

이론상''\ b "'는 효과가 있지만 백 슬래시는 이스케이프 문자 인'\\ b' ->'\ b' 또는 이스케이프 문자 작은 따옴표 :'\ b ' "$ i"'\ b''. 왜'[[ "$ a"= ~ "\\ b $ i \\ b"]]'는 작동하지 않습니다 : bash의 버그 인 것 같습니다. 여기에 설명이 있습니다 : [bash는 단어 경계를 지원합니까? 정규식?] (http://stackoverflow.com/a/12696899/887539) – andlrc

관련 문제