我对bash / unix编程很新。但是我有一个我无法弄清楚的问题。为了以最基本的方式,我的csv文件有一个类似于下面的表。
原件:
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 :(得分:1)
这个awk单行应该做你想做的事:
ansible
awk -F',' '{t=$1;sub(/TYPE/,"",t);gsub(/Hello/,"RESULT"t);print}' file
获取第一列中的数字,并保存在var sub()
t
将所有gsub()
更改为Hello
+ RESULT
答案 1 :(得分:0)
您可以使用sed
。
sed -r 's/(^[ \t]*TYPE)([0-9])(,.*)Hello/\1\2\3RESULT\2/' filename
在上面的命令中,TYPE之后的数字在搜索文本中为()
附近,而\2
用于替换文本以在替换文本中的RESULT
之后附加它。这通常称为反向引用。
你可以google关于" sed搜索和替换",以及如何在sed中使用反向引用。最重要的是搜索和学习"正则表达"。
答案 2 :(得分:0)
假设你真的不想剥离" TYPE"要留下1或2来结束RESULT,但实际上必须测试/设置特定的值:
$ 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
答案 3 :(得分:0)
您没有明确表达对第一列的反应。当规则对于@sps的解决方案而言过于复杂时,您可以尝试其他方法:
f True :: (c -> Bool) -> Bool
当你有很多翻译并且有时需要更改它们时,你想在配置文件中编写它们。 sed命令需要读取配置文件,并且可能会出现sed '/^TYPE1,/ s/Hello/Result1/g;
/^TYPE2,/ s/Hello/OtherResult/g' yourcsvfile
等字符和正则表达式中具有特殊含义的字符的问题。
使用配置文件可能类似于
=/#,
答案 4 :(得分:0)
另一个awk
适用于任何单个数字
$ 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
答案 5 :(得分:0)
使用gensub
和反向引用的另一个AWK(实际上是GAWK):
awk '{print gensub(/^(TYPE)([^,]+)((.*)(Hello))*/,"\\1\\2\\4RESULT\\2","g",$0)}' file
如果记录中有多个匹配项,则它与最后一个匹配第一个匹配项的匹配项匹配。