Shell脚本:如何按多字符分隔符拆分多行大文件?
按多字符分隔符拆分文件为数组的解决方案
针对IFS仅支持单字符分隔符的限制,以下是几种实用的shell工具方案,可直接实现按多字符分隔符拆分大文件并生成数组:
方法1:使用awk拆分并导入数组
awk的字段分隔符FS支持多字符字符串,是处理这类需求的高效工具:
# 定义目标多字符分隔符 DELIMITER="2024-01-18" # 拆分文件并将非空结果存入数组 readarray -t result_array < <(awk -v delimiter="$DELIMITER" 'BEGIN{FS=delimiter}{for(i=1;i<=NF;i++) if($i != "") print $i}' your_large_file.txt)
- 细节说明:awk按指定分隔符拆分每行内容,遍历过滤掉空字段后逐行输出;
readarray -t将输出内容存入数组result_array,-t参数自动移除每行末尾的换行符。
方法2:用sed替换分隔符为换行后导入数组
通过sed将多字符分隔符全局替换为换行符,再读取结果到数组:
DELIMITER="2024-01-18" # 替换分隔符并过滤空行,最终存入数组 readarray -t result_array < <(sed "s/$DELIMITER/\n/g" your_large_file.txt | sed "/^$/d")
- 细节说明:第一个sed命令将所有分隔符替换为换行,第二个sed命令过滤空行,避免数组出现空元素;若分隔符包含正则特殊字符(如
.、+),需在sed中添加转义(例:\.)。
方法3:使用perl处理复杂分隔场景
perl的正则处理更灵活,可自动转义分隔符中的特殊字符,适合复杂场景:
DELIMITER="2024-01-18" readarray -t result_array < <(perl -F"\Q$DELIMITER\E" -ane 'foreach $item (@F) { print "$item\n" if $item ne "" }' your_large_file.txt)
- 细节说明:
-F"\Q$DELIMITER\E"指定分隔符,\Q\E自动转义正则元字符;遍历拆分后的字段,仅输出非空内容,最后导入数组。
额外提示
如果处理的是超大文件,一次性将所有内容存入数组可能占用过多内存,可考虑在awk/perl中直接处理每个字段,而非先存入数组,降低内存消耗。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

