2

いくつかの列を含む CSV ファイルがあり、最初の列は 5 桁の顧客番号で、他の列は「;」で区切られています。

次に例を示します。

12345;some;other;cols;comes;here
;some;other;cols;comes;here
;some;other;cols;comes;here
67890;some;other;cols;comes;here
34567;some;other;cols;comes;here
;some;other;cols;comes;here
;some;other;cols;comes;here
;some;other;cols;comes;here
;some;other;cols;comes;here
24315;some;other;cols;comes;here

最初の列が空の場合は、最後に指定した顧客 ID を設定する必要があります。結果は次のようになります。

12345;some;other;cols;comes;here
12345;some;other;cols;comes;here
12345;some;other;cols;comes;here
67890;some;other;cols;comes;here
34567;some;other;cols;comes;here
34567;some;other;cols;comes;here
34567;some;other;cols;comes;here
34567;some;other;cols;comes;here
34567;some;other;cols;comes;here
24315;some;other;cols;comes;here

ここで、bash スクリプトを使用してファイルを行ごとに読み取り、行が数字で始まるかどうかを確認したいと考えています。はいの場合は、行を「;」で分解します array[0] (最初の値) で customerID を設定します。次に、行が数字で始まっていないかどうかを確認し、行の先頭に 5 桁を書きたいと考えています。しかし、顧客 ID で配列インデックスにアクセスできません。

これは私のスクリプトです:

#!/bin/bash
while read line
do
    row=$line
    if echo $row |grep "^[0-9].*$" > /dev/null;
      then
        arr=$(echo $row | tr ";" "\n")
        echo ${arr[0]};
    fi
done < $1

「;」なしで行全体を取得します 次の arr[0] のような CustomerID ではありません。行頭の数字をファイルに書き戻す方法がわかりません。誰でも私を助けることができますか?

4

2 に答える 2

1

純粋な bash ソリューション:

#!/bin/bash
# Globally set IFS, if you don't like it, wrap it all in a subshell.
IFS=';'
lastID=-1
while read -a row; do
    [[ -z ${row[0]} ]] && row[0]=$lastID
    lastID=${row[0]}
    # Abusing IFS
    echo "${row[*]}"
done < "$1"
于 2013-10-30T10:50:19.840 に答える