AWK - 範囲からSNを生成し、それをレコードに追加します。

AWK - 範囲からSNを生成し、それをレコードに追加します。

コンマで区切られた次の入力ファイルを検討してください。

1,13/06/17,01,03,D151
2,25/06/17,04,06,D154

各レコードのフィールドと3rdフィールドを使用して、4thSNが属するレコードの他のフィールドと同じシリアル番号を生成する必要があります。

最初の記録(03 - 01 = 2+1)はまさにこの新記録です

レコード2(06 - 04 = 2+1)このレコードの新しいレコード数

出力:

1,13/06/17,01,03,D151
1,13/06/17,01,03,D151,1
1,13/06/17,01,03,D151,2
1,13/06/17,01,03,D151,3
2,25/06/17,04,06,D154
2,25/06/17,04,06,D154,4
2,25/06/17,04,06,D154,5
2,25/06/17,04,06,D154,6

SNはIを使用して簡単に作成できますが、forそれを元のレコードにリンクすることはここで問題です。

答え1

それは次のとおりです。

awk -F, '{print; for (i = 0+$3; i <= $4; i++) print $0 FS i}'

答え2

while IFS= read -r l; do
   printf '%s\n' "$l" | tee log
   for i in $(seq $(cut -d, -f3,4 log | tr , '\n')); do
     printf '%s,%s\n' "$l" "$i"
   done
done < input.csv

perl -F, -pe 's|(.*)\K|join $/, $,, map "$1,$_", 0+$F[2]..$F[3]|ex'  input.csv

出力:

1,13/06/17,01,03,D151
1,13/06/17,01,03,D151,1
1,13/06/17,01,03,D151,2
1,13/06/17,01,03,D151,3
2,25/06/17,04,06,D154
2,25/06/17,04,06,D154,4
2,25/06/17,04,06,D154,5
2,25/06/17,04,06,D154,6

説明する

  1. 現在の行はに保存されます$1。現在の行は、修飾子が無効な場合は改行文字と一致しないため、\n$ 1に保存されません。./s
  2. $F[2]..$F[3]=>左から始めて右に終わる一連の数字を生成します。ステップサイズは1です。この0+アーティファクトは、生成される先行ゼロを削除できます。
  3. map現在の行とコンマ区切りの整数を組み合わせて適切な操作を実行します。
  4. 手順3で生成されたすべての文字列は、デフォルトで改行$/文字RSで連結されます。

関連情報