問題一連の数値を提供するBASHスクリプトを解決/強化しようとしています。プロセッサバインディングのためにnumactlに入力する物理プロセッサ番号を抽出するために、トポロジ認識ツール(lstopo-no-graphics)を使用しています。
L3 L#4 共有キャッシュ物理コアの出力例
lstopo-no-graphics --no-io|sed -n "/L3 L#3/,/L3/p"|grep -v "L3\|L2"|tr -s '[:space:]'|cut -d " " -f4|grep -o "[0-9]*"|sort -g|tr '\n' ','|sed '$s/,$//'
結果は数値系列の文字列です。
32,33,34,35,36,37,38,39,96,97,98,99,100,101,102,103
すべてが大丈夫です。私はこのシリーズをとして使用しており、numactl --physcpubin=32,33,34,35,36,37,38,39,96,97,98,99,100,101,102,103
シーケンスをに縮小できるようにしたいと思いますnumactl --physcpubin=32-39,96-103
。複数のカンマで区切られた数値シーケンスを「an」シリーズに縮小し、各シーケンスが連続しているときにカンマで区切るようにしたいと思います。
既存のbashスクリプトには問題はありません。もっときれいな実装を探していますか?(アイデアを持っている人がいる場合)
ベストアンサー1
これを別の名前で保存してくださいrange.awk
。
{
for(i=2;i<=NF+1;i++){ #Visit each number from the 2nd on
if($i==$(i-1)+1){
if(f=="")f=$(i-1) #Candidate to first number of a range
continue
}
printf("%s%s%s%s", f, (f!="" ? "-" : ""), $(i-1), (i>NF ? RS : FS))
f="" #Unset the candidate
}
}
走る: awk -F, -f range.awk
。
または、縮小された1行をコピーして貼り付けます。
awk -F, '{for(i=2;i<=NF+1;i++){if($i==$(i-1)+1){if(f=="")f=$(i-1);continue}printf("%s%s%s%s",f,f!=""?"-":"",$(i-1),i>NF?RS:FS);f=""}}'
フィールド区切り文字をハードコードしていないので-F
。
出力例:
$ awk -F, -f range.awk <<< 32,33,34,35,36,37,38,39,96,97,98,99,100,101,102,103
32-39,96-103
$ awk -F, -f range.awk <<< 0,1,2,5,8,9,11
0-2,5,8-9,11
$ awk -F, -f range.awk <<< 4
4