2016-08-16 10 views
2

私は以下のように見えるのテストと呼ばれる長いファイルで働いています:私は、しかし、私は2番目の列にこれを達成するために必要な、「NIX」に置き換えた文字列「NIS」を作成する必要がありファイル内の特定の列のみを置き換える方法は?

AHAP USA|NIS00333|+NULL|NISGOOGLE|NIS00005|*binary|NISCAR 
KJJLIL123124%|NIS00160|+NULL|NISFACEBOOK|NIS00006|*binary|NISBUR 
ASFASS9992|NIS00164|+NULL|NISTABLE|NIS00008|*binary|NISFANCY 

それはパイプ文字で区切られています、私のデータの区切り記号はパイプ "|"で、私はいくつかの列を持っています。合計7つで、2番目の列で置換をしたいだけです。

は、私が試した:

$ sed s/NIS/NIX/g test 
AHAP USA|NIX00333|+NULL|NIXGOOGLE|NIX00005|*binary|NIXCAR 
KJJLIL123124%|NIX00160|+NULL|NIXFACEBOOK|NIX00006|*binary|NIXBUR 
ASFASS9992|NIX00164|+NULL|NIXTABLE|NIX00008|*binary|NIXFANCY 

をしかし、文字列で一致するすべての列に影響を与えている:私はちょうど第二のカラムに影響を与えたい、NISをしてNIXに変更し、私の所望の出力は次のようになります。

AHAP USA|NIX00333|+NULL|NISGOOGLE|NIS00005|*binary|NISCAR 
KJJLIL123124%|NIX00160|+NULL|NISFACEBOOK|NIS00006|*binary|NISBUR 
ASFASS9992|NIX00164|+NULL|NISTABLE|NIS00008|*binary|NISFANCY 

本当にありがとうございました。どうもありがとうございました。

答えて

3

あなたが列に問題がある場合は、それらの優れた、ネイティブコントロールを持っているawkを使うのですが:

$ awk 'BEGIN {FS=OFS="|"}{gsub("NIS","NIX",$2)}1' file 
AHAP USA|NIX00333|+NULL|NISGOOGLE|NIS00005|*binary|NISCAR 
KJJLIL123124%|NIX00160|+NULL|NISFACEBOOK|NIS00006|*binary|NISBUR 
ASFASS9992|NIX00164|+NULL|NISTABLE|NIS00008|*binary|NISFANCY 

これは2 ND|ベースのフィールド上gsub()交換を行います。この交換が行われた後、awkのデフォルトアクションが実行され、フル(更新された)レコードを保持する$0の印刷が行われます。

+0

感謝として私はawkの代わりにawkを使うことを考えています。awkの代わりに何が置き換えに相当するのでしょうか?sedを使用している場合、sed -iを使用して同じファイル内で変更すると、awkに相当するものは何か分かりますか? – neo33

+0

@ neo33 GNU awk 4.1.0から '-i inplace'を使うことができます。さもなければ、そのトリックは常に 'awk '...' file> tmp_file && mv tmp_file file'です。これらのすべては、[awk save modifications inplace](http://stackoverflow.com/a/16529730/1983854)に説明されています。 – fedorqui

+1

はい、ありがとうございました。本当に助かりました。 – neo33

2

sedの溶液:

$ sed 's/^\([^|]*|[^|]*\)NIS/\1NIX/' infile 
AHAP USA|NIX00333|+NULL|NISGOOGLE|NIS00005|*binary|NISCAR 
KJJLIL123124%|NIX00160|+NULL|NISFACEBOOK|NIS00006|*binary|NISBUR 
ASFASS9992|NIX00164|+NULL|NISTABLE|NIS00008|*binary|NISFANCY 

正規表現、分割:これは唯一の2列目のNISの最初の発生を置き換えることを制限するに有する

^   # Start of line anchor 
\(  # Start of capture gruop 
    [^|]* # Characters other than pipe - first column 
    |  # Column separator between first and second column 
    [^|]* # Characters other than pipe - first part of second column 
\)   # End of capture group 
NIS  # What we actually want to replace 

。例えば、入力はこれ以上ありませんが、それがなかった場合、我々は、それがパターンスペースを変更して置換を繰り返すように条件分岐を使用することができます。

sed ' 
:a 
s/^\([^|]*|[^|]*\)NIS/\1NIX/ 
ta' infile 

:aはジャンプするラベルであり、かつta条件分岐命令です(「置換があれば:aにジャンプ」)。ワンライナーとして

sed ':a;s/^\([^|]*|[^|]*\)NIS/\1NIX/;ta' infile 

BSD(マックOSに見られるような)改行によって守られていないラベルに文句を言うでしょう、私たちは書き換えることができsedの

sed -e ':a' -e 's/^\([^|]*|[^|]*\)NIS/\1NIX/;ta' infile 
+0

これは本当に役に立ちました。私の最初のアプローチはsedでも考えていましたが、これは正規表現を使う良い方法ですが、awkを使用するのはちょっと簡単ですが、 – neo33

+1

@ neo33エドが来る前に私自身に言い聞かせましょう。すべてのケースの99.9%で、awkはsedよりも速く、より強力で、簡潔です。一部の人は、awkに取って代わられているので、sedを無視すべきだと言っています - 私のようなものはほとんどノスタルジックな理由のために手を伸ばしたいのです;) –

+0

はい、おそらくsedがawkよりも少し人気があるしかし、間違いなく、awkの詳細を知ることは非常に良い考えです。私はサポートに感謝します。 – neo33

関連する問題