我想知道如何更改管道分隔数据集中特定位置的单个值。
例如,我有数据集:
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",但仅限于第4和第5个管道符号(|)之间。因此,预期输出将如下所示:
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
之类的内容。
答案 0 :(得分: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)
将每个A
替换为X
中的$5
仅限第5列1
是打印每一行的默认操作答案 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
根据start
和end
变量的值,gensub
函数将在这些值之间的列之间进行替换。
答案 2 :(得分: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
答案 3 :(得分:1)
这可能适合你(GNU sed):
sed -r ':a;s/^(([^|]*\|){4}X*)[^X|]/\1X/;ta' file
迭代,从第四个X
字符替换非|
或X
的所有字符到|
。