首页 > 解决方案 > 在保留空格的同时替换特定列和行范围中的字符串

问题描述

我想知道是否有一种简单的方法使用 sed 或 awk 将特定列中的字符串和多行中的字符串替换为另一个字符串。该字符串在其他列中重复,但我希望替换特定列中的字符串,同时保留列之间不一致的空格数。例如,我希望将第 3 列第 2-4 行中的“A”替换为“B”,同时在列之间保留相同的空格。

 1  2      A     4    A     B       C         A  E    F  G   7  8    9 
 2  11     A     4    A     B       C         A  E    F  G   7  8    9 
 3  12     A     4    A     B       C         A  E    F  G   7  8    9 
 4  13     A     4    A     B       C         A  E    F  G   7  8    9 
 5  14     A     4    A     B       C         A  E    F  G   7  8    9 
 6  15     A     4    A     B       C         A  E    F  G   7  8    9
 .
 .

 1  2      A     4    A     B       C         A  E    F  G   7  8    9 
 2  11     B     4    A     B       C         A  E    F  G   7  8    9 
 3  12     B     4    A     B       C         A  E    F  G   7  8    9 
 4  13     B     4    A     B       C         A  E    F  G   7  8    9 
 5  14     A     4    A     B       C         A  E    F  G   7  8    9 
 6  15     A     4    A     B       C         A  E    F  G   7  8    9
 .
 .

谢谢!

标签: awksed

解决方案


您必须为行范围添加条件,在您必须执行的操作之前,NR是记录号,通常是行号。

awk 'NR>=2 && NR<=4{sub("A","B",$3)} 1' file
1 2 A 3
2 3 B 4
3 4 B 5
4 5 B 6
5 6 A 7

1最后意味着执行默认操作,即对print每一行。也是GNU Awk 字符串函数sub之一。


更新

$0对于您更新的要求,在不拆分到字段的情况下进行替换将起作用。这也sub只替换了第一次出现的Ain line。

awk 'NR>=2 && NR<=4{sub("A","B",$0)} 1' file

推荐阅读