2016-08-12 15 views
0

私はbash/unixプログラミングには全く新しいです。しかし、私は把握できない問題があります。最も基本的な方法でそれを置くために、私のCSVファイルは、以下のようなテーブルを持っています。行頭をSed/Awk/Grepに置き換えてください。

オリジナル:

TYPE1, text, text, text, Hello, text, text 
TYPE2, text, text, Hello, text, text, text 

出力:

TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 

私は最初の列にあるテキストのどのタイプに基づいて、異なった「こんにちは」文字列を置換しようとしています。

「Hello」が見つかった場合は置換するためのコードを作成しましたが、最初の列に対処する方法がわかりません。

ありがとうございました。

答えて

0

これにはsedを使用できます。上記のコマンドで

sed -r 's/(^[ \t]*TYPE)([0-9])(,.*)Hello/\1\2\3RESULT\2/' filename 

、TYPE後の番号は、検索テキストに()によってsorroundされ、そして\2を置き換えるテキストにRESULT後にそれを追加するテキストを置換で使用されています。これは通常、逆参照と呼ばれます。

"sed検索と置換"について、またsedでの後方参照の使用方法については、Googleを利用することができます。最も重要なのは、「正規表現」を検索して学ぶことです。

1

このawkをワンライナーは、あなたが欲しいものを行う必要があります。

awk -F',' '{t=$1;sub(/TYPE/,"",t);gsub(/Hello/,"RESULT"t);print}' file 
  • sub()RESULT + tにすべてHelloを最初の列の数を取得し、VAR t
  • gsub()変更を保存します
0

"TYPE"を削除してRESULTの端にタックに1または2を残したが、実際に特定の値を設定/テストする必要がすること:

$ awk 'BEGIN{FS=OFS=", "} {sub(/Hello/,($1=="TYPE1" ? "RESULT1" : "RESULT2"))} 1' file 
TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 
0

あなたが最初の列に反応する方法を明確にしていませんでした。ルールは@spsの解決のために、あまりにも複雑であるときは、何か他のものを試すことができます。

sed '/^TYPE1,/ s/Hello/Result1/g; 
    /^TYPE2,/ s/Hello/OtherResult/g' yourcsvfile 

あなたはたくさんの翻訳を持ち、時にはそれらを変更する必要があるときは、設定ファイルでそれらを書きたいと思います。 sedコマンドは設定ファイルを読む必要があり、=/#,のような文字と、正規表現で特別な意味を持つ文字に問題が発生する可能性があります。 設定ファイルを使用すると、

# Make configfile 
echo "TYPE1=Result1 
TYPE2=OtherResult2" > translatecsv.cfg 

# test the new cfg file, will it give valid sed commands? 
sed 's#\(.*\)=\(.*\)#/^\1/ s/Hello/\2/g;#;' translatecsv.cfg 

# All together now 
sed "$(sed 's#\(.*\)=\(.*\)#/^\1/ s/Hello/\2/g;#;' translatecsv.cfg)" yourcsvfile 
0

awkgensubとバックリファレンス使用して、任意の一桁の番号

$ awk 'match($1,/^TYPE/){sub("Hello", "RESULT"substr($1,RLENGTH+1,1))}1' file 

TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 
0

でさらに別のAWK(実際にはうまくGAWK)が動作するように働くかもしれない:

awk '{print gensub(/^(TYPE)([^,]+)((.*)(Hello))*/,"\\1\\2\\4RESULT\\2","g",$0)}' file 

レコードに複数のオカレンスがある場合は、最後の一致と一致します。 最初の1つ。

関連する問題