替换第一列文本中的特定字符
Posted
技术标签:
【中文标题】替换第一列文本中的特定字符【英文标题】:Replacing specific characters in first column of text 【发布时间】:2012-05-11 12:38:29 【问题描述】:我有一个文本文件,我正在尝试将第一列中的特定字符 (.) 替换为另一个字符 (-)。每个字段都用逗号分隔。有些行的最后 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:尝试了 sarnold 的建议并得到了我想要的输出。
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,,,
【问题讨论】:
【参考方案1】:.
是“任何字符”的正则表达式。用\
转义它,这意味着.
:
$ 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,
做了什么,但它不是受支持的命令行选项;使用它来设置输出字段分隔符是我的一个错误。在awk
程序中设置OFS
效果很好。
【讨论】:
谢谢!我尝试了您的建议并将其添加到我的原始帖子中。 Hunh,为什么添加-OFS,
实际上也改变了第二列的输出?
嗯,我不知道,但我得到了我想要的输出并且第二列没有改变。
为什么使用 -OFS,我的 $1 是整行?我现在正在尝试更改 2 美元,但无法更改。
抱歉,我不知道为什么我认为添加-OFS
会起作用;我在手册中找不到引导我走上这条路的那个位,但如果你在 awk
脚本本身中设置变量,它会按预期工作。【参考方案2】:
这可能对你有用:
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,,,
【讨论】:
以上是关于替换第一列文本中的特定字符的主要内容,如果未能解决你的问题,请参考以下文章
如果匹配 FLUTTER 中的特定字符,则替换字符串中的字符