我有这个文件内容:
2450TO3450
3800
4500TO4560
我想获得这样的东西:
2450
2454
2458
...
3450
3800
4500
4504
4508
..
4560
基本上我需要在sed
/ awk
中使用一行内容来读取TO
分隔符两边的值并将其注入seq
命令或自己做循环并将其转储到同一个文件中,作为每行的值以任意增量转储,让我们在上面的示例中说4。
我知道我可以使用几个临时文件,转到read
命令并进行排序,但我想在一个单行程中以cat filename |
等开头,因为它已经是一个更大的剧本。
输入的正确性保证因此TO
的左侧总是小于它的大侧。
由于
答案 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。