シェルスクリプトを使用して複数のレコードを追加して、ファイルからレコードを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

答え2

$ awk -v n=10 '
    BEGIN { FS=OFS="," }
    { print }
    NR > 1 { for (i=1; i<=n; i++) { $1++; $8++; $9++; print } }
' 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
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
12345442,10-11-2011,11:11:12.555,0,0,XVC_AS,12,24,29,123454323,qweds

答え3

シェルでなければなりませんか、それとも例えば大丈夫ですかawk?良い

awk -F, -v"CNT=10" 'NR==1; NR==2 {for (;CNT--;) {print; $1++; $8++; $9++}}' OFS=, file
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,14,19,123454323,qweds
12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345438,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345439,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345440,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345441,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds

CNT はprint最初のフィールドを増やし、2 番目の行を掛けます。

シェルでなければならない場合は、試してみてください。

OLDIFS=$IFS
CNT=10
{ read LINE; echo $LINE; read LINE; } <file1
IFS=, ARR=($LINE)
while ((CNT--))
  do    ((ARR[0]++ + ARR[7]++ + ARR[8]++))
        echo "${ARR[*]}"
  done
IFS=$OLDIFS

数を事前に設定する必要があります。それ以外の場合、結果ファイルはかなり大きくなります。

関連情報