gpt4 book ai didi

linux - 使用 Bash 将多个相似的行拆分为两个单独的文件

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:19 27 4
gpt4 key购买 nike

我有一个包含多个子网的巨大文件,如下所示:

234.245.34.324/24
234.214.23.34/24
234.344.234.14/24
234.214.234.314/24
234.245.34.324/23
234.214.23.34/22
234.344.234.14/22
234.214.234.314/23
234.245.34.324/24
234.214.23.34/20
234.344.234.14/21
234.214.234.314/20

它们都具有不同的 IP 地址和相同的子网,例如我有 2340 个子网,/24

现在,我希望将它们分成 2 个文件,其中所有 /24 拆分的 50% 在每个文件中,/23/22 /21

我知道我可以使用 split -l 拆分,但这只会给我行。目的是在两个文件中获得相同数量的子网。

这应该在 Linux bash 中完成,因为它将自动完成。

有人知道怎么做吗?

最佳答案

假设您有可用的 bash 4.3,避免使用临时文件的实现可能如下所示:

#!/usr/bin/env bash
# ^- important: use bash, not sh, as shell

# sort into an array per mask length
declare -A masklens=( )
while IFS=/ read -r addr masklen; do
[[ $addr ]] || continue
masklens[$masklen]=1
declare -a "addrs_${masklen}"
declare -n addrs="addrs_${masklen}"
addrs+=( "$addr" )
done

exec 3>"$1" 4>"$2" # open output files
for masklen in "${!masklens[@]}"; do
declare -n addrs="addrs_${masklen}"
fmt="%s/${masklen}\n"
printf "$fmt" "${addrs[@]:0:(${#addrs[@]} + 1) / 2}" >&3
if (( ${#addrs[@]} > 1 )); then
printf "$fmt" "${addrs[@]:(${#addrs[@]} + 1) / 2}" >&4
fi
done
exec 3>&- 4>&- # close output files

...调用为...

$ splitfiles out1 out2 <infile

关于linux - 使用 Bash 将多个相似的行拆分为两个单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com