2017-09-25 17 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」に変更したいのですが、唯一の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のようなものを使用する必要があります。

答えて

1

設定された入力フィールドセパレータ(FS)、出力フィールドセパレータ(OFS)とカラム5が含まれている場合AAAAXXXXによって置き換える:

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)入力として&出力フィールドセパレータ管を使用するだけ
  • 1 5列の$5XAを置換であります各行を印刷するデフォルトアクション
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に置き換えて繰り返します。