範囲内にないすべての数字を探す

範囲内にないすべての数字を探す

次の内容を含むファイルがあります。

2
4
5

そして1から5までの範囲があります。出力1,3を含むシェルスクリプトが必要です。ファイルに存在せず範囲内にない数値です。

私は何をすべきですか?

答え1

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

このcommコマンドは、(語彙順に)ソートされたファイル間の共通行を報告します。オプションがない場合、3つの列が提供されます。

  1. 最初のファイルでのみ見つかった行
  2. 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つの数字×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

関連情報