如何使用sed按指定行号切换数据处理规则?
用sed按行号分段处理TSV数据
1. 先定位分割行号
先找到出现连续两个-32767填充值的行号(TSV用制表符分隔,用\t匹配):
grep -n "^-32767\t-32767$" site8_slt.nc.tsv
假设输出为500:-32767 -32767,则分割行号为500,后续处理从该行开始切换规则。
2. sed处理到指定行号停止
如果只想处理前N行并终止,用q命令实现,比如提取前499行的有效数据(保留偶数行):
sed '1~2d;q499' site8_slt.nc.tsv
1~2d:删除所有奇数行,保留前期的偶数有效行q499:处理到第499行后立即停止
3. 按行号分段执行不同处理逻辑
针对前后段的不同规则,用sed的地址范围+命令块语法,指定不同区间执行对应操作:
sed '1,499{1~2d};500,$2~2d' site8_slt.nc.tsv > cleaned_site8_slt.tsv
1,499{1~2d}:对第1到499行,删除奇数行,保留偶数有效行500,$2~2d:对第500行到文件末尾,删除偶数行,保留奇数有效行- 最终结果输出到
cleaned_site8_slt.tsv
4. 自动切换规则的进阶写法(无需手动找行号)
如果想让sed自动识别连续-32767的行并切换规则,用分支命令实现:
sed -n ' :pre n p /^-32767\t-32767$/{ n :post p n b post } b pre ' site8_slt.nc.tsv
- 先进入
pre分支:跳过一行(删除奇数行)并打印偶数行;当匹配到连续-32767的行时,切换到post分支,打印当前行(奇数行)并跳过下一行(删除偶数行),直到文件结束
内容的提问来源于stack exchange,提问作者Tankibor
相关产品推荐
相关产品推荐

