所以我有一个数据文件,其中包含如下行:
class subject
1-2 x
3 y
4-5 a
我需要提取类列中给出的范围,并按照范围所示多次打印主题中的文本。我应该得到这样的东西
class subject
1 x
2 x
3 y
4 a
5 a
答案1
使用awk
:
awk '{ if ( split($1, range,"-")>1 ){
for(i=range[1]; i<=range[2]; i++) { print i, $2; };
next;
};
}1' infile
split()
字符的第一列-
,并使用第一个和第二个索引作为循环内范围的开始和结束,并每次在范围上增量打印同一行,然后读取next
行并执行相同的操作;如果没有范围,则使用 awk 默认打印操作输出行1
。
如果除了破折号之外还有其他字符表示范围,您可以修改split()
函数的第三个参数来提及它,例如:
split($1, range, /-|,|\.\./)
处理-
,,
和..
作为范围字符。
输入示例(制表符分隔):
class subject
1,2 x
3 y
4-5 a
3..6 z
输出经过修改split()
以识别-
,,
和..
作为范围分隔符:
class subject
1 x
2 x
3 y
4 a
5 a
3 z
4 z
5 z
6 z