如何在Unix中处理带标识平面文件:移除页眉、页脚及首列?
处理带标识头/尾的平面文件(Unix环境)
嘿,这个需求在Unix环境下用常用的文本处理工具就能轻松实现,我给你分享几种实用的方案,都是日常工作里常用的:
方法1:用awk(最灵活推荐)
awk是处理结构化文本的利器,能精准匹配行标识并做对应处理:
awk ' # 处理页眉行:去掉开头的"H|"后输出 /^H\|/ { print substr($0, 3); next } # 处理数据行:去掉开头的"L|"后输出 /^L\|/ { print substr($0, 3); next } # 跳过页脚行 /^F\|/ { next } ' input.txt > output.txt
解释:
^H\|匹配以H|开头的页眉行,substr($0,3)从第3个字符开始输出(跳过前两个字符的H|)- 同理处理以
L|开头的数据行 - 直接跳过以
F|开头的页脚行 - 最后将结果重定向到
output.txt
方法2:用sed(简洁快速)
sed适合简单的文本替换/删除操作,一行命令就能搞定:
# 基础版(兼容所有sed版本) sed -e '/^F\|/d' -e 's/^[HL]\|//' input.txt > output.txt # 扩展正则版(GNU sed可用,更清晰) sed -E -e '/^F\|/d' -e 's/^[HL]\|//' input.txt > output.txt
解释:
/^F\|/d:删除所有以F|开头的页脚行s/^[HL]\|//:把行首的H|或L|替换为空字符串,保留后面的内容
方法3:grep + sed组合(分步处理)
如果你习惯分步处理,也可以先用grep过滤掉页脚,再用sed清理行标识:
grep -v '^F\|' input.txt | sed 's/^[HL]\|//' > output.txt
解释:
grep -v '^F\|':反向匹配,输出所有不以F|开头的行(即保留页眉和数据行)- 管道后用sed替换掉行首的
H|/L|
验证效果
拿你给的示例输入测试:
H|STUDENT_ID|COURSE_NUMBER|CREDIT_COUNT
L|1234|E4|23
L|3487|D3|30
L|1234|Y4|19
L|1234|S2|28
F|4
运行任意一种命令后,output.txt的内容都会是:
STUDENT_ID|COURSE_NUMBER|CREDIT_COUNT 1234|E4|23 3487|D3|30 1234|Y4|19 1234|S2|28
内容的提问来源于stack exchange,提问作者LearneR
相关产品推荐
相关产品推荐

