2017-09-25 140 views
-4

我想知道如何在管道分隔数据集中的特定位置更改单个值。使用sed替换第n个和第(n + 1)个分隔符之间的文本

例如,我有数据集:

01|456|AAAA|James Bond|AAAA|207085 
02|AAAA|BBBB|Marco Polo|BBBB|937311723 
03|321332|BBBB|Brad Pitt|AAAA|6296903 
04|3213|AAAA|AAAA|BBBB|62969 

我要改变每一个“AAAA”值“XXXX”,但只有第四和第五竖线之间(|)。因此,预计输出如下:

01|456|AAAA|James Bond|XXXX|207085 
02|AAAA|BBBB|Marco Polo|BBBB|937311723 
03|321332|BBBB|Brad Pitt|XXXX|6296903 
04|3213|AAAA|AAAA|BBBB|62969 

是它实现只用sed功能,或者是否有必要使用类似awk

回答

1

设置输入分隔符(FS),输出字段分隔符(OFS),如果第5列包含AAAA通过XXXX取代:

awk 'BEGIN{FS=OFS="|"} $5=="AAAA" {$5="XXXX"}1' file 

输出:

 
01|456|AAAA|James Bond|XXXX|207085 
02|AAAA|BBBB|Marco Polo|BBBB|937311723 
03|321332|BBBB|Brad Pitt|XXXX|6296903 
04|3213|AAAA|AAAA|BBBB|62969 
1
更好

使用awk此:

awk 'BEGIN{FS=OFS="|"} {gsub(/A/, "X", $5)} 1' file 

01|456|AAAA|James Bond|XXXX|207085 
02|AAAA|BBBB|Marco Polo|BBBB|937311723 
03|321332|BBBB|Brad Pitt|XXXX|6296903 
04|3213|AAAA|AAAA|BBBB|62969 
  • BEGIN{FS=OFS="|"}使用管作为输入&输出字段分隔符
  • gsub(/A/, "X", $5)替换每个AX$5用于第五列仅
  • 1是默认行为打印每行
1
awk -v start=4 -v end=5 'BEGIN{FS=OFS="|"}{for(i=start;i<=end;i++) gsub(/AAAA/,"XXXX",$i)}1' inputfile 
01|456|AAAA|James Bond|XXXX|207085 
02|AAAA|BBBB|Marco Polo|BBBB|937311723 
03|321332|BBBB|Brad Pitt|XXXX|6296903 
04|3213|AAAA|XXXX|BBBB|62969 

基于startend变量的值,gensub功能会做这些值之间落下列之间的替代品。

1

这可能会为你工作( GNU sed):

sed -r ':a;s/^(([^|]*\|){4}X*)[^X|]/\1X/;ta' file 

将第|号字符替换为不是X|X的所有字符。

相关问题