【问题标题】:bash: split a long comma-separated list to two partsbash:将一个以逗号分隔的长列表分成两部分
【发布时间】:2013-10-14 19:41:38
【问题描述】:

我有一个 bash 脚本,它从外部命令读取逗号和空格分隔的服务器名称列表:

server_0.example.com, server_1.example.com, ..., server_70.example.com

脚本应该运行一个外部命令,该命令接受该形式的服务器列表,但一次限制为 50 个服务器。因此,我需要将其拆分为两个大小大致相同的列表:

server_0.example.com, server_1.example.com, ..., server_35.example.com

server_35.example.com, server_36.example.com, ..., server_70.example.com

【问题讨论】:

    标签: bash list split


    【解决方案1】:

    这可以是一种方法:

    awk -F, '{for (i=1; i<=NF/2; i++) printf "%s, ", $i} <-- prints first half
             {printf "\n"} <--- prints new line
             {for (i=NF/2+1; i<=NF; i++) printf "%s, ", $i}  <-- prints second half
             {printf "\n"} <--- prints new line
            '
    

    测试

    $ awk -F, '{for (i=1; i<=NF/2; i++) printf "%s, ", $i} {printf "\n"} {for (i=NF/2+1; i<=NF; i++) printf "%s, ", $i} {printf "\n"}' <<< "server_0.example.com, server_1.example.com, ..., server_70.example.com"
    server_0.example.com,  server_1.example.com, 
     ...,  server_70.example.com, 
    

    更新

    当 NF 为奇数时不跳过一个值:

    awk -F, '{for (i=1; i<=int(NF/2); i++) printf "%s, ", $i} <-- prints first half
             {printf "\n"} <--- prints new line
             {for (i=int(NF/2)+1; i<=NF; i++) printf "%s, ", $i}  <-- prints second half
             {printf "\n"} <--- prints new line
            '
    

    【讨论】:

    • 对于吹毛求疵的道歉:这可能会省略一个给定 odd 个字段的字段。
    • 没问题...但真的吗?例如NF=7,第一个循环是(i=1; i&lt;=3...),第二个循环是(i=4; i&lt;=7...)
    • 天哪,我认为for 表达式中的除法结果总是整数。
    • 更新为int(NF/2)。现在应该没问题(经过测试)。谢谢,@devnull!
    • 是的,它现在运行良好。 (修改后的版本不需要测试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多