使用BASH对TXT文件中分隔符存储的表格按电话号码排序
解决BASH下按指定字段排序分隔符拼接表格数据的问题
问题场景
你的TXT文件里所有表格行的字段用|拼接成了单一行,每4个字段(3个|分隔符)对应一行原始数据,需要按每行的第3个字段(电话号码)升序排序,同时保留每行字段的关联性,最终存入文件。
可行解决方案
直接用sed+awk+sort的组合就能搞定,比手动模拟二维数组或用cut循环简单太多,分两种输出需求给出命令:
1. 输出为每行4个字段的格式化表格
如果需要输出成每行一条记录的清晰格式,执行以下命令:
sed 's/ | /|/g' input.txt | awk -F'|' '{ for (i=1; i<=NF; i+=4) { printf "%s|%s|%s|%s\n", $i, $(i+1), $(i+2), $(i+3) } }' | sort -t'|' -k3,3n | sed 's/|/ | /g' > sorted_formatted.txt
- 第一步
sed:把|替换成单一|,避免字段内空格干扰分割 awk:按|分割所有字段,每4个字段组成一行输出sort:以|为分隔符,按第3个字段(电话号码)数值升序排序- 最后一步
sed:把|换回原来的|格式,结果存入sorted_formatted.txt
2. 输出为和原输入一致的单行长字符串
如果需要保持原输入的单行长字符串格式,执行:
sed 's/ | /|/g' input.txt | awk -F'|' '{ for (i=1; i<=NF; i+=4) { printf "%s|%s|%s|%s|", $i, $(i+1), $(i+2), $(i+3) } }' | sort -t'|' -k3,3n | tr '\n' ' ' | sed 's/|/ | /g; s/ | $//' > sorted_single_line.txt
- 前几步和上面一致,
tr '\n' ' '把排序后的多行合并成一行 - 最后
sed还原分隔符并去掉末尾多余的|,结果存入sorted_single_line.txt
为什么不用BASH数组或cut循环?
BASH原生对多维数组的支持很差,手动用cut循环存储字段容易出错,尤其是处理带空格的字段时,而awk天生擅长字段拆分和批量处理,搭配sort的排序能力,能快速搞定这类需求。
内容的提问来源于stack exchange,提问作者LeDub
相关产品推荐
相关产品推荐

