首页 > 解决方案 > Bash 构建多个逗号分隔的列表,限制为一个更大列表中的 N 个项目

问题描述

我有一个巨大的列表(几百万行)这种类型的值:

abcx437u2bz;dhnauih41291
bbvcae13421;fjhllalsi432
...

我需要以这种方式构建许多较小的列表:

abcx437u2bz,bbvcae13421,...

所以应该只取之前的第一部分,;并且值应该分成更小的逗号分隔列表,一行中限制为 1000 个项目。

如何在 bash 脚本中完成此任务,以便自动执行此任务?

标签: bashshell

解决方案


bash可以这样说:

nr=1
while IFS=";" read -r a rest; do
    str+=",$a"
    if (( nr % 1000 == 0 )); then
        echo "${str#,}"
        str=""
    fi
    nr=$(( nr + 1))
done < file.txt
[[ -n $str ]] && echo "${str#,}"

但是bash可能不适合处理一个巨大的文件,处理数百万行需要几分钟。
相反,您可以说awk

awk -F";" '{
    str = str "," $1
    if (NR%1000 == 0) {
        print substr(str, 2)
        str = ""
    }
}
END {
    if (length(str)) print substr(str, 2)
}
' file.txt

这将使执行时间加快数十倍。


推荐阅读