bash - Bash 构建多个逗号分隔的列表,限制为一个更大列表中的 N 个项目
问题描述
我有一个巨大的列表(几百万行)这种类型的值:
abcx437u2bz;dhnauih41291
bbvcae13421;fjhllalsi432
...
我需要以这种方式构建许多较小的列表:
abcx437u2bz,bbvcae13421,...
所以应该只取之前的第一部分,;
并且值应该分成更小的逗号分隔列表,一行中限制为 1000 个项目。
如何在 bash 脚本中完成此任务,以便自动执行此任务?
解决方案
你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
这将使执行时间加快数十倍。
推荐阅读
- angular - 延迟加载子模块的子模块到应用程序
- node.js - 如何在请求之外获取数据
- angular7 - 模块构建失败(来自 ./node_modules/@ngtools/webpack/src/index.js):
- python - 如何对列标题中的 n 列使用 ffill()
- python - flake8 e999 在 python2 中使用 fstrings (with future_fstrings)
- postgresql - 如何在 postgres 中将没有时区列的时间戳更改为文本、varchar 和 long
- angular - 在 Angular 7 中模拟本地存储
- entity-framework - EF Core 2.1 中是否有 addOrUpdateRange 方法?
- cqrs - CQRS/ES AR 删除命令
- android - TWA 有assetLinks,但仍在使用地址栏打开