在CSV的Column中搜索一个模式,并使用sed命令替换同一行中的另一个模式



我想检查CSV文件第二列中的模式(仅当模式以开头时),如果该模式存在,则替换同一行中的其他模式。

如果第二列中存在模式676,我为下面的csv编写了以下sed命令,将I更改为N。但它检查第7列和第9列中的676,因为676也存在。理想情况下,如果前缀676存在,我只希望检查第二行。我只想检查第二列中的前缀676(模式不在第二个值Ex-46769777的中间或结尾),然后对,I,to,N,进行更改,。

sed -i  '/,676/ {; s/,I,/,N,/;}' temp.csc
6768880,55999777,S,I,TTTT,I,67677,yy
6768880,676999777,S,I,TTTT,I,67677,yy 
6768880,46769777,S,I,TTTT,I,67677,yy  

要求的预期结果

6768880,55999777,S,I,TTTT,I,67677,yy
6768880,676999777,S,N,TTTT,N,67677,yy
6768880,40999777,S,I,TTTT,I,67677,yy  

如果您不受sed的约束,awk可能是更好的选择。试试看:

awk -F"," '{match($2,/^676/)&&gsub(",I",",N")}{print}' temp.csc

match语法将第二列与以(^)676开头的数字进行匹配。CCD_ 5用CCD_ 7代替CCD_。

结果: 6768880,55999777,S,I,TTTT,I,67677,yy 6768880,676999777,S,N,TTTT,N,67677,yy 6768880,46769777,S,I,TTTT,I,67677,yy

这要求在进行任何更改之前,676出现在第二列的开头:

$ sed   '/^[^,]*,676/ s/,I,/,N,/g' file
6768880,55999777,S,I,TTTT,I,67677,yy
6768880,676999777,S,N,TTTT,N,67677,yy 
6768880,46769777,S,I,TTTT,I,67677,yy  

注:

  • 正则表达式/^[^,]*,676/要求676出现在行中第一次出现逗号之后。更详细地说:

    • ^与行的开头匹配

    • [^,]*与第一列匹配

    • ,676匹配第一个逗号,后跟676

  • 在您想要的输出中,,I,每次出现在线路上时都会被,N,替换。为此,在替换命令中添加了g(表示全局)。

最新更新