カンマで区切られた数字の範囲を始めから終わりまで順に縮小します。

カンマで区切られた数字の範囲を始めから終わりまで順に縮小します。

問題一連の数値を提供する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

おすすめ記事