如何用awk仅处理指定行(首行)分割,其余行原样输出?
解决awk仅处理指定行(首行/匹配行)并保留其余行的问题
当然可以实现!这是awk处理文本时非常实用的场景,我们可以利用awk的内置变量和条件判断来精准控制哪些行需要分割处理,哪些行直接原样输出。
一、仅对首行执行分割操作,其余行原样输出
awk的内置变量NR代表当前处理的行号,我们可以通过判断NR==1来锁定首行,对其执行分割取第二字段的操作,其他行直接打印整行内容即可。
写法1:清晰的分支判断
awk -F "<next>" 'NR==1{print $2} NR>1{print $0}' file
- 当
NR==1(首行)时,按<next>分割后打印第二个字段$2 - 当
NR>1(非首行)时,直接打印整行$0
写法2:更简洁的单行写法
awk里如果条件后跟着一个真值(比如1),会默认执行print $0,所以可以简化成:
awk -F "<next>" 'NR==1{$0=$2}1' file
- 首行时,把当前行内容
$0替换成分割后的第二个字段$2 1是恒成立的条件,会触发默认的print $0,不管是修改后的首行还是未修改的其他行,都会被打印出来
二、扩展:按条件匹配行执行分割,其余行保留
如果需要根据特定条件(比如行内容包含某个模式)来决定是否执行分割,只需要把NR==1换成对应的匹配条件即可。
比如我们要匹配所有包含name<next>的行,对这些行执行分割取第二字段,其他行原样输出:
awk -F "<next>" '/name<next>/{$0=$2}1' file
/name<next>/是正则匹配条件,只要当前行包含该字符串,就执行$0=$2替换操作- 同样通过
1触发默认打印,未匹配的行直接输出原内容
效果验证
针对你的输入文件:
name
Rocky id: 1321 age: 36 exp: 10 occupation: doctor
(假设其他行比如)Bob id: 7890 age: 42 exp: 15 occupation: engineer
执行上述命令后,输出会是:
Rocky id: 1321 age: 36 exp: 10 occupation: doctor
Bob id: 7890 age: 42 exp: 15 occupation: engineer
完全符合你的需求!
内容的提问来源于stack exchange,提问作者codecrazy46
相关产品推荐
相关产品推荐

