文字列からすべてのn番目の文字を抽出します。

文字列からすべてのn番目の文字を抽出します。

解決策を見つけようとしています。これ質問。これまでこの問題を解決した方法は次のとおりです。

  • すべての文字を一緒に追加して、1つの長い文字列を作成します。
  • 上記の手順を完了した後、スペースまたはタブのスペースをすべて削除して、1つの大きな文字列だけを残します。

次のコマンドを使用して上記の手順を構築できました。

column -s '\t' inputfile | tr -d '[:space:]'

したがって、このような入力ファイルの場合

1   0   0   0   0   0

0   1   1   1   0   0

上記のコマンドを適用した後、私の値は次のようになります。

100000011100

それでは、この大きな文字列に次の方法を適用してみましょう。

元のOPで要求されているように、すべての6文字を抽出して文字列の最後まで配列要素に追加します。

したがって、基本的には上記の手順で次のように配列要素を作成しようとします。

101番目7番目の文字)、2番目018番目の文字)、(3番目9番目の文字)、(4番目10番目の文字)、(5番目11番目の文字)、(6番目と12文字)最初の文字)最初の文字)。01010000

だから私の質問は、追加処理のために配列に追加できるようにすべてのn文字をどのように抽出できますか? (この場合 n=6)。

ベストアンサー1

2行

bash配列を生成するbash純粋なソリューションは次のとおりです。

s="100000011100"
array=($(
    for ((i=0; i<${#s}-6; i++))
    do
        echo "${s:$i:1}${s:$((i+6)):1}"
    done
    ))
echo "${array[@]}"

これにより、質問に示されているのと同じ出力が生成されます。

10 01 01 01 00 00

ここで重要な要素はbashを使用することです。部分文字列拡張。 Bashを使用すると、parameterviaなどの変数から部分文字列を抽出できます${parameter:offset:length}。私たちの場合、オフセットはループ変数によって決まり、i長さは常にです1

すべてのライン数に対する汎用ソリューション

たとえば、元の文字列が18文字であると仮定すると、iのi番目、i + 6番目、i + 12番目の文字を0から5まで抽出しようとします。だから:

s="100000011100234567"
array=($(
    for ((i=0; i<6; i++))
    do
        new=${s:$i:1}
        for ((j=i+6; j<${#s}; j=j+6))
        do 
            new="$new${s:$j:1}"
        done
        echo "$new"
    done
    ))

echo "${array[@]}"

これにより、次のような出力が生成されます。

102 013 014 015 006 007

同じコードを6文字の行に拡張できます。たとえば、s3行(18文字)がある場合:

s="100000011100234567abcdef"

その後、出力は次のようになります。

102a 013b 014c 015d 006e 007f

おすすめ記事