다음 내용이 포함된 파일이 있습니다.
2
4
5
그리고 1부터 5까지의 범위가 있습니다. 출력 1,3이 포함된 쉘 스크립트가 필요합니다. 파일에 존재하지 않고 범위에 없는 숫자입니다.
나는 무엇을 해야 합니까?
답변1
comm -13 <(sort file) <(seq 1 5 | sort) | sort -n
이 comm
명령은 (어휘순으로) 정렬된 파일 간의 공통 행을 보고합니다. 옵션이 없으면 세 개의 열이 제공됩니다.
- 첫 번째 파일에서만 발견된 라인
- 두 번째 파일에서만 발견된 라인
- 두 파일에 공통되는 줄입니다.
-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
옵션 역방향 패턴 일치seq
1
(기본적으로 생략됨)에서 다음까지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