![AWK - 从范围生成 SN 并将其添加到记录中](https://linux22.com/image/114805/AWK%20-%20%E4%BB%8E%E8%8C%83%E5%9B%B4%E7%94%9F%E6%88%90%20SN%20%E5%B9%B6%E5%B0%86%E5%85%B6%E6%B7%BB%E5%8A%A0%E5%88%B0%E8%AE%B0%E5%BD%95%E4%B8%AD.png)
考虑以下逗号分隔的输入文件:
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
只需使用for
I 即可生成 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
.当前记录中的\n
不会保存到 $1 中,因为.
与换行符不匹配,除非/s
修饰符有效。 $F[2]..$F[3]
=> 生成一个从左开始到右结束的数字序列,步长为 1。该0+
工件可以去掉否则会产生的前导零。map
将通过组合当前行和以逗号分隔的整数来执行适当的操作。- 步骤 3 中生成的所有这些字符串都通过 连在一起,
$/
默认RS
为换行符。