Linux下如何对指定行范围删除空白分隔文本的最后4列
实现方法
你的需求可以直接用awk实现,它天然支持任意空白符作为字段分隔符,且可以按行号范围执行不同处理逻辑,是最适配该场景的方案:
方案1:awk 实现(推荐,无兼容问题)
直接执行如下命令即可:
awk 'NR<776{print; next} {for(i=1;i<=21;i++) printf "%s%s", $i, (i==21?"\n":" ")}' 待处理文件路径 > 处理后输出文件路径
命令逻辑说明:
NR是awk内置的行号计数变量,当行号小于776时,直接输出原行内容,跳过后续处理,保证前775行和原文件完全一致- 对于776行及之后到文件末尾的内容,遍历输出前21个字段,自动丢弃后面多出来的4个0字段,输出时字段间用空格分隔,和前面行的格式、列数完全对齐
- 该方案自动识别连续空格、制表符等任意空白分隔符,不需要额外做格式转换,不会出现列偏移问题。
方案2:cut 组合命令实现
如果你倾向于用你提到的cut命令,可以通过分块读取文件的方式实现,注意cut默认不支持连续空白作为单个分隔符,需要先压缩连续空白:
( head -n 775 待处理文件路径 tail -n +776 待处理文件路径 | tr -s '[:blank:]' | cut -d ' ' -f 1-21 ) > 处理后输出文件路径
注意:该方案存在一定局限,如果文件中存在行首空白、字段间混合多种空白符的情况,可能出现列计数偏移,优先选择awk方案。
内容的提问来源于stack exchange,提问作者Glee
相关产品推荐
相关产品推荐

