如何在shell的column命令中使用多字符分隔符,或寻找替代工具
column命令多字符分隔符问题解答
核心结论
原生column命令不支持多字符作为单个分隔符:其-s参数接收的是字符集合,你传入-s 'XYZ'时,X、Y、Z三个独立字符都会被识别成分隔符,这就是你得到错误输出的根本原因。
可行解决方案
方案1:awk中转处理(无特殊字符冲突,通用性最高)
先用awk将多字符分隔符替换为文本中几乎不会出现的不可见字符(如ASCII SOH字符\001),再传给column处理:
# 处理文件输入 awk -F 'XYZ' -v OFS='\001' '{$1=$1;print}' 你的输入文件 | column -t -s $'\001' # 处理管道输入 cat 你的输入文件 | awk -F 'XYZ' -v OFS='\001' '{$1=$1;print}' | column -t -s $'\001'
执行后可直接得到你期望的输出:
Xfirstvalue secondvalue thirdvalue 1valueY 2value 3valZue
方案2:sed中转处理(写法简单,适合临时使用)
如果你的输入文本中没有某个特殊单字符(比如|、^等),可以直接用sed把多字符分隔符替换为该单字符,再传给column:
sed 's/XYZ/|/g' 你的输入文件 | column -t -s '|'
注意需要保证你选的替换用单字符不会在原文本内容中出现,否则会分割错误。
方案3:纯awk实现(无需依赖column,跨平台兼容性好)
如果不想依赖column命令,可以直接用awk完成分割+对齐的全流程:
awk -F 'XYZ' ' { # 遍历所有行,统计每列的最大宽度 for (i=1; i<=NF; i++) { max_width[i] = (length($i) > max_width[i] ? length($i) : max_width[i]) rows[NR][i] = $i } } END { # 按最大宽度格式化输出每一行 for (n=1; n<=NR; n++) { for (i=1; i<=length(max_width); i++) { printf "%-*s ", max_width[i], rows[n][i] } print "" } } ' 你的输入文件
内容的提问来源于stack exchange,提问作者sc8ing
相关产品推荐
相关产品推荐

