5

テキストファイルがあり、最初の列の特定の文字(。)を別の文字(-)に置き換えようとしています。すべてのフィールドはコンマで区切られます。一部の行の最後の3列は空であるため、最後に3つのコンマがあります。

テキストファイルの例:

abc.def.ghi,123.4561.789,ABC,DEF,GHI
abc.def.ghq,124.4562.789,ABC,DEF,GHI
abc.def.ghw,125.4563.789,ABC,DEF,GHI
abc.def.ghe,126.4564.789,,,
abc.def.ghr,127.4565.789,,,

私が試したのは、awkを使用して「。」を置き換えることでした。最初の列に「-」を付けて、内容を印刷します。

ETA:サーノルドの提案を試して、私が望む出力を得ました。

ETA2:最初の列を長くすることができます。最初の3つだけを変更する方法はありますか?最初の列に「-」があるので、出力を取得します

abc-def-ghi-qqq.www,123.4561.789,ABC,DEF,GHI
abc-def-ghq-qqq.www,124.4562.789,ABC,DEF,GHI
abc-def-ghw-qqq.www,125.4563.789,ABC,DEF,GHI
abc-def-ghe-qqq.www,126.4564.789,,,
abc-def-ghr-qqq.www,127.4565.789,,,
4

2 に答える 2

9

.「任意の文字」の正規表現表記です。でそれをエスケープし\、それは意味し.ます:

$ awk -F, '{gsub(/\./,"-",$1); print}' textfile.csv 
abc-def-ghi 123.4561.789 ABC DEF GHI
abc-def-ghq 124.4562.789 ABC DEF GHI
abc-def-ghw 125.4563.789 ABC DEF GHI
abc-def-ghe 126.4564.789   
abc-def-ghr 127.4565.789   
$ 

デフォルトでは、出力フィールドの区切り文字はスペースです。それを設定OFS = ","するために設定します。

$ awk  -F, 'BEGIN {OFS=","} {gsub(/\./,"-",$1); print}' textfile.csv 
abc-def-ghi,123.4561.789,ABC,DEF,GHI
abc-def-ghq,124.4562.789,ABC,DEF,GHI
abc-def-ghw,125.4563.789,ABC,DEF,GHI
abc-def-ghe,126.4564.789,,,
abc-def-ghr,127.4565.789,,,

これでも、複数のフィールドを変更できます。

$ awk  -F, 'BEGIN {OFS=","} {gsub(/\./,"-",$1); gsub("1", "#",$2); print}' textfile.csv 
abc-def-ghi,#23.456#.789,ABC,DEF,GHI
abc-def-ghq,#24.4562.789,ABC,DEF,GHI
abc-def-ghw,#25.4563.789,ABC,DEF,GHI
abc-def-ghe,#26.4564.789,,,
abc-def-ghr,#27.4565.789,,,

何をするのかわかりませんが-OFS, サポートされているコマンドラインオプションではありません。それを使用して出力フィールドセパレーターを設定するのは私の側の間違いでした。OFSプログラム内の設定はawkうまくいきます。

于 2012-05-02T02:41:49.457 に答える
3

これはあなたのために働くかもしれません:

awk -F, -vOFS=, '{for(n=1;n<=3;n++)sub(/\./,"-",$1)}1' file
abc-def-ghi-qqq.www,123.4561.789,ABC,DEF,GHI
abc-def-ghq-qqq.www,124.4562.789,ABC,DEF,GHI
abc-def-ghw-qqq.www,125.4563.789,ABC,DEF,GHI
abc-def-ghe-qqq.www,126.4564.789,,,
abc-def-ghr-qqq.www,127.4565.789,,,
于 2012-05-02T06:56:20.753 に答える