Bashを使用して配列の既知の要素から不明な要素にパラメータを印刷する方法

Bashを使用して配列の既知の要素から不明な要素にパラメータを印刷する方法

金髪の瞬間を過ごしています。

これは私のデータです。myfile.csv

1429829254,e,SE,StckXchg,HDCU3000623,d,scan,253,47968,94,1420824420,JSSE-213,199,BS,KIT,*OUT*
1429897704,e,SE,StckXchg,HDCU3000623,d,scan,253,68496104,103,1420923818,SP-TMX6BP-101-112Z,*OUT*
1429897718,e,SE,StckXchg,HDCU3000623,d,scan,253,68510090,104,1420923832,02132,*OUT*
1429897767,e,SE,StckXchg,HDCU3000623,d,scan,253,68559085,105,1420923878,02132,*OUT*
1429912759,e,SE,StckXchg,HDCU3000623,d,scan,255,47966,107,1420924040,JSF-1,4"MEG0004,*OUT*
1429912766,e,SE,StckXchg,HDCU3000623,d,scan,255,54955,108,1420924047,02134,*OUT*
1429982863,e,SE,StckXchg,HDCU3000623,d,scan,256,47965,120,1420987942,JSDL-JA120901S,*OUT*
1429982870,e,SE,StckXchg,HDCU3000623,d,scan,256,54953,121,1420987961,02132,*OUT*
1429982877,e,SE,StckXchg,HDCU3000623,d,scan,256,61954,109,1420971277,02134,*OUT*

現在、このデータを配列に入れ、各要素を個別に抽出します。

ただし、入力データが変更されたため、線がある要素はさまざまになり、大きく変わる可能性があります。上記の例の12番目の要素から最後の要素までデータをどのように抽出するのか疑問に思います。

私のコードを使って私がしたことは次のとおりです。

cat $out_file_name |  while read line
do
    awk_var=`echo "$line" | awk -F"," '{print $1, $5, $10, $12, $13, $14}'`         #Get the appropriate arguments
    awk_var_array=($awk_var)

    timestamp=${awk_var_array[0]}
    container==${awk_var_array[1]}
    scan_id=${awk_var_array[2]}
    part_no=${awk_var_array[3]}
    direction=${awk_var_array[4]}

    #further processing and send the above to a mysql table
done

しかし、今これは明らかに動作しません。したがって、12番目の要素から最後の要素(入力/出力)まで、すべての要素を保存する方法を見つける必要があります。

forループを使って完了しましたか?たぶんこんなことはありませんか?

for element_count in $(seq 13 $({#awk_var_array[@]}-1))
do
    var_name=my_var_''$element_count
    $var_name=${awk_var_array[element_count]
done

答え1

あなたはそれを使用することができますbash パラメータ拡張 ${parameter:offset:length}配列のある形式:

$ array=($(seq 20))
$ printf "%s " "${a[@]: -12}"
9 10 11 12 13 14 15 16 17 18 19 20

答え2

いろいろな意見から得た追加情報に基づいて必要なのは、次のコードだけだと思います。

while IFS=, read timestamp x x x container x x x x scan_id x part_no direction rest
do
   # compose SQL command using "${timestamp}" "${container}" ... "${direction}" "${rest}" and send it to mysql database
done < "${out_file_name}"

注:x読み取りコマンドの表現はスキップされ(固有の識別子が割り当てられていない)、引数リストに明示的restに列挙されたフィールドを除く変数のすべてのフィールドを含む仮想フィールドですread

関連情報