범위 내에 없는 모든 숫자 찾기

범위 내에 없는 모든 숫자 찾기

다음 내용이 포함된 파일이 있습니다.

2
4
5

그리고 1부터 5까지의 범위가 있습니다. 출력 1,3이 포함된 쉘 스크립트가 필요합니다. 파일에 존재하지 않고 범위에 없는 숫자입니다.

나는 무엇을 해야 합니까?

답변1

comm -13 <(sort file) <(seq 1 5 | sort) | sort -n

comm명령은 (어휘순으로) 정렬된 파일 간의 공통 행을 보고합니다. 옵션이 없으면 세 개의 열이 제공됩니다.

  1. 첫 번째 파일에서만 발견된 라인
  2. 두 번째 파일에서만 발견된 라인
  3. 두 파일에 공통되는 줄입니다.

-1, -2, -3옵션을 전달하여 해당 열을 억제 할 수 있습니다 . 그러니 -13떠나<(seq 1 5 | sort)출력에서 발견된 라인만.

답변2

다음과 같이 작업을 완료할 수 있습니다.grep

seq 5 | fgrep -vxf <(tr ' ' '\n' < file)
  • tr온라인 출력을 위해 파일 문자열을 숫자로 변환
  • <()명령 대체(명령의 출력을 파일로 읽음)
  • -f옵션은 grep파일에서 패턴을 읽는다는 의미입니다.
  • -x옵션은 "전체 줄과 일치"를 의미합니다. 예를 들어 1일치하지 11않거나21
  • -v옵션 역방향 패턴 일치
  • seq1(기본적으로 생략됨)에서 다음까지 5개행으로 구분된 숫자 목록을 생성합니다.

편집: 파일에 이미 숫자 1개 x 줄 1개가 포함되어 있는 경우 생략할 수 있습니다.tr

seq 5 | fgrep -vxf file

답변3

(완벽하지는 않은) 솔루션의 예는 다음과 같습니다.

for i in `seq 1 5`
do
flag=1
for j in `cat filename_with_numbers`
do
if [ $i -eq $j ]
then flag=0
fi
done
if [ $flag -eq 1 ]
then echo $i
fi
done

답변4

#!/bin/sh
#make a range of numbers
range=$(seq -s' ' 5)
#make a copy of range
tmp_range=$range
#loop the content
for i in $(echo 2 4 5)
do
  #loop the range
  for j in $range
  do
    if [ $i -eq $j ]
    then
        #delete in the copy if match
        tmp_range=$(echo $tmp_range|sed "s/$i//")
        #exit this loop and continue the first loop if match
        continue 2
    fi
  done
done
echo $tmp_range

관련 정보