bash-如何在一行中使用2个数字来创建序列
我有以下文件内容:bash-如何在一行中使用2个数字来创建序列,bash,awk,sed,Bash,Awk,Sed,我有以下文件内容: 2450TO3450 3800 4500TO4560 我想得到这样的东西: 2450 2454 2458 ... 3450 3800 4500 4504 4508 .. 4560 基本上,我需要一个sed/awk中的一行程序,它将读取到分隔符两侧的值,并将这些值注入到seq命令中,或者自己执行循环,并以任意增量将其作为每行的值转储到同一个文件中,比如上面示例中的4 我知道我可以使用多个一个临时文件,执行read命令并
2450TO3450
3800
4500TO4560
我想得到这样的东西:
2450
2454
2458
...
3450
3800
4500
4504
4508
..
4560
基本上,我需要一个sed
/awk
中的一行程序,它将读取到
分隔符两侧的值,并将这些值注入到seq
命令中,或者自己执行循环,并以任意增量将其作为每行的值转储到同一个文件中,比如上面示例中的4
我知道我可以使用多个一个临时文件,执行read
命令并进行排序,但我希望以cat filename |
等开头的一行代码进行排序,因为它已经是更大脚本的一部分
输入的正确性是有保证的,所以到
的左侧总是小于其较大的一侧
谢谢像这样的东西可能有用:
awk -F TO '{system("seq " $1 " 4 " ($2 ? $2 : $1))}'
这将告诉awk
到system
(执行)命令seq 10 4 10
用于仅包含10的行(输出10),类似seq 10 4 40
的命令用于10TO40
等行。输出似乎与您的示例相符。如下所示:
awk -F'TO' -v inc=4 'NF==1{print $1;next}{for(i=$1;i<=$2;i+=inc)print i}' file
试一试:
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编号。给定:
txt="2450TO3450
3800
4500TO4560"
你可以做:
echo "$txt" | awk -F TO '{$2<$1 ? t=$1 : t=$2; for(i=$1; i<=t; i++) print i}'
echo“$txt”| awk-F到“{$2这可能适合您(GNU-sed):
如果LHS包含TO
这对于sed
或awk
来说不是一个好任务,它将导致一些非常神秘的结果。请尝试一个python-c
一行代码,甚至是一个小的三行脚本。首先尝试了这个脚本,并且似乎可以根据需要工作。谢谢。将尝试其他,也提供反馈。有效且最短,这是重要条件之一。所有awk+宏实际上都有效。感谢这有一些意外行为。尚不确定是什么原因导致它,但在某些情况下它似乎是从0开始的,并且它不会从输出中消除其自身的范围。请共享一些输入数据,不要很抱歉格式化了,仍然掌握着它…上面是输入,下面是输出:2072到2076到2080 4 8…
一直递增4到2128,然后它又从4开始
echo "$txt" | awk -F TO '{$2<$1 ? t=$1 : t=$2; for(i=$1; i<=t; i++) print i}'
echo "$txt" | awk -F TO -v p=4 '{$2<$1 ? t=$1 : t=$2; for(i=$1; i<=t; i+=p) print i}'
sed -r 's/(.*)TO(.*)/seq \1 4 \2/e' file