配列の反復要素(最初の要素と最後の要素を除く)

配列の反復要素(最初の要素と最後の要素を除く)

配列があり、最初の要素と最後の要素を除くすべての要素を繰り返したいと思います。

たとえば、配列に5つの要素がある場合は、1 2 3 4 5反復後にその要素が続く必要があります1 2 2 3 3 4 4 5

私のbashコマンドは次のようになります

$ newarr=("${myarr[0]}")
$ for i in $(seq 1 $((${#myarr[@]}-2))) ; do newarr+=( "${myarr[i]}" "${myarr[i]}"); done
$ newarr+=("${myarr[-1]}")

私よりも明確な方法はありますか?

myarrまた、これを引数を受け取り返す関数でラップする方法も知りたいですnewarr。 (これらの関数を作成した後、各要素がファイルに行を格納するようにファイルから配列を読み込み、配列から関数を呼び出します。これらの関数を作成するのが良い方法ではない場合は、お知らせください。)

ありがとうございます。

ベストアンサー1

ジョブ数を少し減らして、次の呼び出しをスキップできますseq

for (( i = 1; i < ${#myarr[@]} - 1; ++i )); do
    newarr+=( "${myarr[i]}" "${myarr[i]}" )
done
newarr=( "${myarr[0]}" "${newarr[@]}" "${myarr[-1]}" )

newarrこれは最初から空であると仮定します。unset newarryそうでない場合は、最初にしてください。

関数として(これは渡された配列を変更します):

dup_interal_items () {
    typeset -n arr=$1
    local tmparr

    for (( i = 1; i < ${#arr[@]} - 1; ++i )); do
        tmparr+=( "${arr[i]}" "${arr[i]}" )
    done
    arr=( "${arr[0]}" "${tmparr[@]}" "${arr[-1]}" )
}

これ名前配列の値は関数に渡され、名前参照変数は配列arrの要素にアクセスするために使用されます。最後に、元の配列は結果を含むように更新されます。

私は代わりにこれをする返品関数だけが終了状態を返すことができるので、配列です。別の方法は、入力配列の2つの名前を渡すことです。そして配列を出力し、関数の両方の名前を使用して変数を参照します。

あるいは、関数の値をechoORしprintfて(この場合は新しい配列をまったく設定する必要はありません)、基本コードからそのデータを解析することもできます。次に、コマンド置換内で関数を呼び出す必要があります。

参考にしてくださいできないarrこの関数は、使用される特定の名前スコープ規則のために呼び出される配列とともに呼び出されますbash。これが問題の場合は、arr関数の変数名を変更する必要があります。

テスト:

$ myarr=( 1 2 3 "here we go" )
$ dup_interal_items myarr
$ printf 'Element: %s\n' "${myarr[@]}"
Element: 1
Element: 2
Element: 2
Element: 3
Element: 3
Element: here we go

ファイルの最初の行と最後の行を除くすべての行をコピーするには、次の手順を実行します。

sed -e '1b' -e '$b' -e 'p' <file

スクリプトがsed最初の行または最後の行にある場合、スクリプトは末尾(暗黙の印刷ステートメントがある場合)に分岐しますが、他のすべての行は印刷されます(したがって、他のすべての行は明示的に最後の行によって印刷され、暗黙的pに印刷されます)。

またはdon_crisstiが提供したものです。

sed 'p;1d;$d' <file

各行を明示的に印刷してから最初と最後の行のループを終了しますが、他のすべての行は暗黙的に印刷します(2番目)。

メモリに1行以上を格納しない同等のプログラムは、awk作成するのは簡単ではありません。

おすすめ記事