我的文件中包含按范围写入的值,我需要将它们“取消映射”到普通列表,如何有效实现这一点?
例子:
141540000,141569999,1
147280000,147289999,0
第一列是范围起始值,第二列是范围结束值,第三列是与范围中每个数字相对应的一些数据。
我想要实现的示例结果:
141540000, 1
141540001, 1
141540002, 1
...
141569998, 1
141569999, 1
147280000, 0
147280001, 0
...
147289999, 0
我想最好的方法是使用 sed 或 awk 之类的东西,但我不知道如何解决。
答案1
awk -F, '{for (i=$1;i<=$2;i++) print i ", " $3}' file
对于每一行,我们执行 for 循环并打印数字和最后一个字段。
答案2
对于 Perl,使用范围运算符在列表上下文中:
perl -F, -ne 'print "$_, $F[2]" for ($F[0]..$F[1])' file
或者
perl -F, -ne 'print map { "$_, $F[2]" } ($F[0]..$F[1])' file
答案3
while IFS=, read -r start stop data <&3;do
seq -f "%.0f, $data" "$start" "$stop"
done 3< file
该seq
命令将以 1 为步长从开始编号到停止编号循环显示,并一路打印消息。
- 数据不包含任何格式特殊字符
%
或反斜杠序列。