bash - 如何在一行上使用2个数字来创建序列

时间:2016-06-07 15:54:47

标签: bash awk sed

我有这个文件内容:

2450TO3450  
3800  
4500TO4560  

我想获得这样的东西:

2450  
2454  
2458  
...  
3450  
3800  
4500  
4504  
4508  
..  
4560  

基本上我需要在sed / awk中使用一行内容来读取TO分隔符两边的值并将其注入seq命令或自己做循环并将其转储到同一个文件中,作为每行的值以任意增量转储,让我们在上面的示例中说4。

我知道我可以使用几个临时文件,转到read命令并进行排序,但我想在一个单行程中以cat filename |等开头,因为它已经是一个更大的剧本。

输入的正确性保证因此TO的左侧总是小于它的大侧。

由于

5 个答案:

答案 0 :(得分:2)

像这样:

awk -F'TO' -v inc=4 'NF==1{print $1;next}{for(i=$1;i<=$2;i+=inc)print i}' file

或者,如果您喜欢以cat开头:

cat file | awk -F'TO' -v inc=4 'NF==1{print $1;next}{for(i=$1;i<=$2;i+=inc)print i}'

答案 1 :(得分:1)

这样的事可能有用:

awk -F TO '{system("seq " $1 " 4 " ($2 ? $2 : $1))}'

这会告诉awk system {执行}命令seq 10 4 10以获取仅包含10的行(其中输出10),以及类似于seq 10 4 40的行10TO40 {1}}。输出似乎与您的示例相符。

答案 2 :(得分:0)

尝试一下:

sed 's/TO/ /' file.txt | while read first second; do if [ ! -z "$second" ] ; then seq $first 4 $second; else printf "%s\n" $first; fi; done

sed用于将TO替换为空格字符。

read用于读取行,如果有2个数字,seq用于生成序列。否则,将打印uniq编号。

答案 3 :(得分:0)

假设:

txt="2450TO3450  
3800  
4500TO4560"

你可以这样做:

echo "$txt" | awk -F TO '{$2<$1 ? t=$1 : t=$2; for(i=$1; i<=t; i++) print i}'

如果您想要增量大于1:

echo "$txt" | awk -F TO -v p=4 '{$2<$1 ? t=$1 : t=$2; for(i=$1; i<=t; i+=p) print i}'

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/(.*)TO(.*)/seq \1 4 \2/e' file

如果LHS包含TO,则评估替换命令的RHS。