Linuxで配列に値を格納する方法

Linuxで配列に値を格納する方法

配列に値を保存できません。以下はファイルデータです。

123|23.23|2.34|3.45|2019-20-1

配列の2番目、3番目、4番目の値が必要です。後で3つのパラメータや他のフィールドの組み合わせの代わりに4つのパラメータを選択できるように、コードは一般的である必要があります。

array ={23.33 2.34 3.45 2019-20-1}

作業コードの一部:

declare -a alpha=()

alpha=($(awk '{n = split($0, t, "|")
for(i = 0; ++i <= n;) print t[i]}' <<<'$2|$3|$4'))
echo "$alpha[@]"

入力を次のように渡します。'$2|$3|$4'

以下のような配列出力が必要です。

alpha={$2 $3 $4}

印刷するときは、echo "${alpha[@]}"すべての値を印刷する必要があります。

出力: $2 $3 $4

*注:この値を追加のコードのループとして使用して別の値を取得できるように、出力には2つの値の間にスペースが必要です。

答え1

bashreadコマンドはフィールドを配列に格納できます。

while IFS='|' read -r -a fields; do
    # do stuff with the elements of "${fields[@]}"
done < file

答え2

これはあなたの場合に動作します

alpha=( $(awk -F'|'  '{ for(i=1;++i<=NF;) printf $i" "}' yourfile ) )

NF(ハードコードされたフィールド番号の代わりにフィールド番号)を使用します。

答え3

#!/bin/bash

# Read the data into the array fields from the
# file called "file". This assumes that the data
# is a single line with fields delimited by
# |-characters.
mapfile -d '|' -t fields <file

# The last entry in the fields array will quite
# likely have a trailing newline at the end of it.
# Remove that newline if it exists.
fields[-1]=${fields[-1]%$'\n'}

# These are the column numbers from the original
# data that we'd like to keep.
set -- 2 3 4

# Extract those columns from the fields array. Note
# that we have to decrement the numbers by one as
# arrays in bash are indexed from zero.
for column do
        array+=( "${fields[column-1]}" )
done

# Output the elements of the resulting array:
printf '%s\n' "${array[@]}"

# For outputting with spaces in-between the values
# rather than newlines:
printf '%s\n' "${array[*]}"

理由なく出力別の目的で使用したい場合は、最後に配列の値を追加してください。 特定の形式で値を出力したいとしましょう。(その間にスペースがあります)あなたはそれらを解析する必要があることを意味します再びそして他のコード。それはまったく不要です。すでに配列に値があります。

値の配列を繰り返します。

for value in "${array[@]}"; do
    # Use "$value" here.
done

または、rawデータ配列を使用してくださいfields

for column in 2 3 4; do
    value=${fields[column-1]}
    # Use "$value" here.
done

答え4

bashパラメータ拡張、コマンド置換、または算術拡張を引用しないと、分割が発生$(<...)します。

だからここにあります:

IFS='|'                # split on | instead of the default of SPC|TAB|NL

set -o noglob          # disable globbing which is another side effect of leaving
                       # expansions unquoted

set -- $(<file.data)'' # do the splitting. The extra '' is so that
                       # a|b| is split into "a", "b" and "" for instance.
                       # also note that it splits an empty string into one empty
                       # element.

array=("$2" "$3" "$4")

関連情報