次の内容を含むファイルがあります。
2
4
5
そして1から5までの範囲があります。出力1,3を含むシェルスクリプトが必要です。ファイルに存在せず範囲内にない数値です。
私は何をすべきですか?
答え1
comm -13 <(sort file) <(seq 1 5 | sort) | sort -n
このcomm
コマンドは、(語彙順に)ソートされたファイル間の共通行を報告します。オプションがない場合、3つの列が提供されます。
- 最初のファイルでのみ見つかった行
- 2番目のファイルでのみ見つかった行
- 両方のファイルに共通の行です。
-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つの数字×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