일련의 숫자에서 누락된 내용을 나열하는 가장 간결한 스크립트는 무엇입니까? [복사]

일련의 숫자에서 누락된 내용을 나열하는 가장 간결한 스크립트는 무엇입니까? [복사]

예를 들어 콘텐츠가 있습니다.

001
002
004
008
010

라는 텍스트 파일에서 file누락된 콘텐츠를 어떻게 추출할 수 있습니까 3 5 6 7 9?

답변1

일방 awk통행:

$ awk 'NR != $1 { for (i = prev + 1; i < $1; i++) {print i} } { prev = $1 + 1 }' file
3
5
6
7
9

더 명확하게 말하자면:

awk 'NR != $1 {
  for (i = prev + 1; i < $1; i++) {
    print i
  }
} 
{ 
  prev = $1
}'

각 줄에 대해 줄 번호가 숫자와 일치하는지 확인하고 일치하지 않으면 prev이전 숫자( )와 현재 숫자(포함되지 않음, 따라서 i = prev + 1) 사이의 모든 숫자를 인쇄합니다.

답변2

내 접근 방식은 시작 및 끝 제한과 같은 두 개의 변수를 초기화하고 시작 제한을 파일 이름에 추가하고 무한 반복하고 시작 및 끝 제한을 비교하고 시작 번호가 파일 이름보다 크면 종료하므로 숫자의 크기를 제어하는 ​​것입니다. 끝 번호를 확인하려면 파일 A 시작 제한이 존재하고 증가하는지 확인하세요.

StartNumber=$1
EndNumber=$2

while true; do
      [ ${StartNumber} -gt ${EndNumber} ] && { exit 0 ; }
      if [ ! -f ${FileName}_${StartNumber} ]; then
       echo ${StartNumber}
      fi
      ((StartNumber+=1))
done

귀하의 의견을 바탕으로 한 몇 가지 제안 사항은 다음과 같습니다.

  • find 명령을 실행 find . -type f하고 결과를 반복해 보세요.
  • 각 파일에 대해 위 명령으로 생성된 애플리케이션은 echo ${filename} | tr -dc 0-9숫자를 가져오는 데에만 사용됩니다.
  • "yyyyddd"를 얻을 수 있으며 이를 시작 제한으로 사용하고 종료 제한으로 오늘 날짜와 비교할 수 있습니다.

답변3

샘플 파일을 사용한다고 가정하면 다음 명령이 실행됩니다.

join -a 1 -o 1.1 2.1 -e missed <(seq -f '%03g' $(tail -1 <(sort file))) file | grep missed

이 출력을 생성합니다

003 missed 005 missed 006 missed 007 missed 009 missed

그게 필요하다면 내가 설명을 해줄 수 있어

관련 정보