解決策を見つけようとしています。これ質問。これまでこの問題を解決した方法は次のとおりです。
- すべての文字を一緒に追加して、1つの長い文字列を作成します。
- 上記の手順を完了した後、スペースまたはタブのスペースをすべて削除して、1つの大きな文字列だけを残します。
次のコマンドを使用して上記の手順を構築できました。
column -s '\t' inputfile | tr -d '[:space:]'
したがって、このような入力ファイルの場合
1 0 0 0 0 0
0 1 1 1 0 0
上記のコマンドを適用した後、私の値は次のようになります。
100000011100
それでは、この大きな文字列に次の方法を適用してみましょう。
元のOPで要求されているように、すべての6文字を抽出して文字列の最後まで配列要素に追加します。
したがって、基本的には上記の手順で次のように配列要素を作成しようとします。
10
(1番目と7番目の文字)、(2番目01
と8番目の文字)、(3番目と9番目の文字)、(4番目と10番目の文字)、(5番目と11番目の文字)、(6番目と12文字)最初の文字)最初の文字)。01
01
00
00
だから私の質問は、追加処理のために配列に追加できるようにすべての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を使用すると、parameter
viaなどの変数から部分文字列を抽出できます${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文字の行に拡張できます。たとえば、s
3行(18文字)がある場合:
s="100000011100234567abcdef"
その後、出力は次のようになります。
102a 013b 014c 015d 006e 007f