【问题标题】:Shellscript: Is it possible to format seq to display n numbers per line?Shellscript:是否可以格式化 seq 以每行显示 n 个数字?
【发布时间】:2014-08-21 02:19:14
【问题描述】:

是否可以格式化 seq 以显示所需范围但每行有 N 个数字?

假设我想要 seq 20,但输出如下:

1 2 3 4 5        
6 7 8 9 10        
11 12 13 14 15        
16 17 18 19 20        

我的下一个猜测是嵌套循环,但我不确定如何... 任何帮助将不胜感激:)

【问题讨论】:

  • seq 20 | xargs -n 5 应该做你需要的事。或者如果你使用 bash echo {1..20} | xargs -n 5 就可以了。

标签: linux shell loops formatting seq


【解决方案1】:

使用可以使用awk根据您的需要对其进行格式化。

$ seq 20 | awk '{ORS=NR%5?FS:RS}1'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20

ORSawk 的内置变量,代表输出记录分隔符,默认值为\nNRawk 的内置变量,用于保存行号。 FS 是内置变量,代表字段分隔符,默认值为空格。 RS 是代表记录分隔符的内置变量,默认值为\n

我们的动作是一个三元运算符,检查NR%5 是否为真。当 NR%5 不为 0(因此为真)时,它使用 FS 作为输出记录分隔符。当它为假时,我们使用 RS 作为输出记录分隔符的换行符。

1 最后触发awk 默认操作,即打印该行。

【讨论】:

    【解决方案2】:

    您可以使用xargs 来限制每行显示的顺序。

    $ seq 20 | xargs -n 5
    1 2 3 4 5
    6 7 8 9 10
    11 12 13 14 15
    16 17 18 19 20
    

    -n 5 参数告诉 xargs 只显示 5 个序列号。

    如果你有 bash,你可以使用内置序列。

    echo {1..20} | xargs -n 5
    

    【讨论】:

    • 感谢鼓励发帖。
    • +1 为简单起见。请注意,对于非常多的集合,这会很慢。
    【解决方案3】:

    使用 Bash:

    while read num; do 
        ((num % 5)) && printf "$line " || echo "$line"
    done < <(seq 20)
    

    或者:

    for i in {1..20}; do
        s+="$i "
        if ! ((i % 5)); then
            echo $s
            s=""
        fi
    done
    

    【讨论】:

    • 既然你可以控制i 的值,那么 eval 就不会受到伤害。你可以说for i in {1..20..5}; do eval echo {$i..$(($i+4))}; done。唯一需要注意的是,仅 bash 版本 4.X 支持增量。
    • 是的,另一个很好的解决方案。对于大量集合会更快。
    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多