AWK - 从范围生成 SN 并将其添加到记录中

AWK - 从范围生成 SN 并将其添加到记录中

考虑以下逗号分隔的输入文件:

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

使用每个记录中的3rd4th字段,我需要生成与 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

只需使用forI 即可生成 SN,但将它们链接到原始记录就是这里的问题。

答案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为换行符。

相关内容