如何对目录下ASCII文件按文件名数字排序后横向拼接并补零对齐列
实现方案
1. 正确排序文件名
你之前的sort -V无法满足要求的核心原因是默认会优先匹配文件名前缀字符,我们需要明确提取文件名末尾的数字作为排序依据,命令如下:
# 生成按末尾数字升序排列的文件名列表 sorted_files=$(ls data_*_* | awk -F'_' '{print $NF,$0}' | sort -n | cut -d' ' -f2-)
执行后得到的文件名顺序就是你预期的data_Z_1、data_E_45、data_N_457。
2. 计算所有文件的最大行数
# 统计所有文件的行数,取最大值 max_line=$(wc -l $sorted_files | sort -n | tail -2 | head -1 | awk '{print $1}')
3. 对短文件末尾补0.0对齐最大行数
# 遍历每个排序后的文件,生成补零后的临时文件 idx=0 for f in $sorted_files; do awk -v max="$max_line" '{print} END{for(i=NR+1;i<=max;i++) print "0.0"}' "$f" > "tmp_$idx" idx=$((idx+1)) done
4. 横向拼接所有文件得到最终结果
# 拼接临时文件,输出到最终结果文件 paste tmp_* > final_result.txt # 如果需要用空格对齐成等宽列,可以替换为下面的命令 # paste tmp_* | column -t > final_result.txt
5. 清理临时文件
rm tmp_*
内容的提问来源于stack exchange,提问作者manas
相关产品推荐
相关产品推荐

