シェルスクリプトを使用して複数のレコードを追加して、ファイルからレコードを1000回またはn回コピーします。

シェルスクリプトを使用して複数のレコードを追加して、ファイルからレコードを1000回またはn回コピーします。

abc.txtというファイルには、次の履歴があります。

ID, date, timestamp, count, idcount, unit, code, Pcode, ccode, bid, vcode

12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds

より多くのnoを生成するためにUnixシェルコードを書きたいと思います。レコードを記録するには、列 ID、Pcode、および ccode を増やし、残りの列はそのままにします。

12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds

12345433,10-11-2011,11:11:12.555,0,0,XVC_AS,12,15,20,123454323,qweds

12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,16,21,123454323,qweds

12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,17,22,123454323,qweds

12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,18,23,123454323,qweds

12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,19,24,123454323,qweds
.
.
.
.
1000 times or n times

ベストアンサー1

質問の入出力に空行が実際に存在しないと仮定します。使用ミラーmlr)、まずヘッダー内の余分なスペースをクリーンアップしてから、$n個々のデータレコードのコピーを作成します。その後、それを2番目のMiller呼び出しに渡してレコードを更新し、名前IDと列を追加します。Pcodeccode

mlr --csv clean-whitespace then bootstrap -n "$n" file |
mlr --csv put '
    NR == 1 { @ID=$ID; @Pcode=$Pcode; @ccode=$ccode }
    NR > 1 {
        $ID    = @ID    + NR - 1;
        $Pcode = @Pcode + NR - 1;
        $ccode = @ccode + NR - 1;
    }'

質問のデータとn=10シェルのデータが与えられると、次のように出力されます。

ID,date,timestamp,count,idcount,unit,code,Pcode,ccode,bid,vcode
12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345433,10-11-2011,11:11:12.555,0,0,XVC_AS,12,15,20,123454323,qweds
12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,16,21,123454323,qweds
12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,17,22,123454323,qweds
12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,18,23,123454323,qweds
12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,19,24,123454323,qweds
12345438,10-11-2011,11:11:12.555,0,0,XVC_AS,12,20,25,123454323,qweds
12345439,10-11-2011,11:11:12.555,0,0,XVC_AS,12,21,26,123454323,qweds
12345440,10-11-2011,11:11:12.555,0,0,XVC_AS,12,22,27,123454323,qweds
12345441,10-11-2011,11:11:12.555,0,0,XVC_AS,12,23,28,123454323,qweds

ヘッダーの削除を有効awkまたは無視して更新するフィールドがフィールド1、8、9であることがわかっているとします。また、awkCSVはサポートされていないため、「単純CSV」データ、つまりカンマや改行を含むフィールドを含まないデータを扱っていると仮定する必要があります。

awk -v n="$n" '
    BEGIN { OFS=FS="," }
    NR==1 { print; next }
    {
        for (i=1; i<=n; ++i) {
            print
            $1++; $8++; $9++
        }
    }' file

おすすめ記事