Bash如何根据首行label_port位置删除每行对应数量的前置字符
方案1:按表头字符数逐行裁剪(完全符合你的需求)
用awk一行命令即可实现,逻辑和你要求的完全一致:先读取第一行统计label_port前的字符总数,再逐行裁剪开头对应数量的字符:
awk 'NR==1{match($0,/label_port/);cut_len = RSTART - 1} {print substr($0, cut_len + 1)}' 你的文本文件路径
效果说明
针对你提供的示例文本,运行后输出结果如下:
label_port| mtu| 7| 9122| 8| 9122| label_port| mtu| 7| 9122| 8| 9122|
方案2:按列匹配裁剪(更稳妥,兼容性更高)
如果存在行对齐偏差、列宽不一致的场景,按字符数裁剪可能出现错位,更推荐按列拆分匹配的方案,自动识别label_port所在的列序号,直接输出该列及之后的所有列:
awk -F '|' 'NR==1{for(i=1;i<=NF;i++){if($i ~ /label_port/) target_col = i}} {for(j=target_col;j<=NF;j++){printf "%s|",$j};printf "\n"}' 你的文本文件路径
方案3:Windows环境可用的Python实现
如果没有Shell运行环境,可以用下面的Python脚本实现相同功能:
file_path = "替换为你的文本文件路径" with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() if not lines: exit() # 定位label_port在表头的起始位置 cut_length = lines[0].find("label_port") if cut_length == -1: print("表头未找到label_port字段") exit() # 逐行裁剪后写入新文件,也可以直接打印输出 with open("处理后结果.txt", "w", encoding="utf-8") as f: for line in lines: f.write(line[cut_length:])
内容的提问来源于stack exchange,提问作者user10002209
相关产品推荐
相关产品推荐

