2017-04-04 20 views
1

私はSOを見て多くのことが似ていますが、これはあまり複雑ではありません。私はちょうどそこに着くようです... 私はタスクを自動化するcsvテキスト操作に取り組んでいます。 私はコミュニケーションをコミュニケーションに置き換える必要があります。 しかし、スポーツコミュニケーションの文字列が表示されたら、私はそれを変更したくありません。私は、共通のコマンド・ライン・ソリューションは、素晴らしいことだ文字列の一部に一致するsedまたはawk

sed -i.bak "s/[Sports]! Communication,/Communication - articulating one\'s self;/g" out.csv 

にその近くには、私はawkの溶液で罰金が、これは本当にbashのファイルにそのをsedのに慣れだと思う

unassigned,2.5,"Sports Communication,","The Campus...lots of other data...will be required.",Communication,Collaboration,Brand 

の通信が可能コラボレーションやブランドとの切り替えや

あなたはこのような Awkステートメントを使用することができます
+1

あなたが行が別の行(または)カンマ区切りですなわちどのように見えるか、私たちを与えることができます – Inian

+0

入力フラグメントを表示 – RomanPerekhrest

+0

csvフラグメントが追加されました – brad

答えて

3

awk -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file 
がありません

[...]「インプレース:(4.1.0 releasedので)、それは"inplace" file editingのオプションがあり、最新のGNU awkでの入力ファイル用

unassigned 2.5 "Sports Communication " "The Campus...lots of other data...will be required." Communication - articulating one's self; Collaboration Brand 

以下のように出力を生成します

"拡張機能はGNU" sed -i "の機能をシミュレートするために使用できます。 [...]

、単に一時ファイルを使用して、それをバック交換し、拡張に必要な

gawk -i inplace -v INPLACE_SUFFIX=.bak -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file 

(または)旧バージョン用にファイルのバックアップを維持します

awk -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file > temp && mv temp > file 

直接置換を行い、不必要なmatch()を避けるために、以下の1-と-のみのエド・モートンのコメントに基づいて、簡素化の一つのレベル、

awk -F\, '{for(i=1;i<=NF;i++) {sub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }1' file 
+0

'$ i =="通信の代わりに 'match($ i、/^Communication $ /)'を使うのはなぜですか?なぜそれを検索するのですか?それを変更しようとするのではなく、変更しますか? 1つの可能な置換のためにsub()の代わりにgsub()を使用するのはなぜですか?最後に、フィールド内の文字列にカンマを含めることができるため(この投稿のサンプル入力を参照)、awkベースのソリューションにはFPATが必要です。 –

+1

@EdMorton:いつものようにあなたの貴重なコメントを感謝します。私は多くの変更を加える必要があると思います。 「FPAT」解決法で失われた。おそらく、あなたは自分自身OPはおそらくすでに上に移動しているので、答えはすでに選択されていて、それはちょっと、その点での解を投稿努力を無駄にしていますので、将来的に探している人だけで受け入れ答えに焦点を当てるとき、私は通常、それをスキップ – Inian

+1

を1に投稿できます。しかし、基本的には、awkでCSVファイルを解析するには 'FS ="、 "'の代わりに 'FPAT ="([^、] *)|( ''^"" + \ ")" 'それはGNU awkでしか動作しないので、 '' a、b、c ''、d 'は ''、 ''、 '<"b,c">'、 ''の4つの' ''、' <"b>'、' 。 '、と' '詳細はhttps://www.gnu.org/software/gawk/manual/gawk.html#Splitting-By-Contentを参照してください –

関連する問題