コンマで区切られた次の入力ファイルを検討してください。
1,13/06/17,01,03,D151
2,25/06/17,04,06,D154
各レコードのフィールドと3rd
フィールドを使用して、4th
SNが属するレコードの他のフィールドと同じシリアル番号を生成する必要があります。
最初の記録(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
。現在の行は、修飾子が無効な場合は改行文字と一致しないため、\n
$ 1に保存されません。.
/s
$F[2]..$F[3]
=>左から始めて右に終わる一連の数字を生成します。ステップサイズは1です。この0+
アーティファクトは、生成される先行ゼロを削除できます。map
現在の行とコンマ区切りの整数を組み合わせて適切な操作を実行します。- 手順3で生成されたすべての文字列は、デフォルトで改行
$/
文字RS
で連結されます。