如何匹配和更改分号分隔文件的列中的字符串?

时间:2015-06-16 08:23:00

标签: regex awk sed gawk

我有一个分号分隔的csv文件,如下所示:

column1;column2;;123564;128;;IJL;value;;;;;3705;;;;;;;;
column1;column2;;26789786413423;;CCE;value value;;;;;;3705;;;;;;;;
column1;column2;;4564564;128;;SSE;value;;;;;;;;;;;;;
column1;column2;;4645646;128;;JJY;someting X;;;;;;;;;;;;;
column1;column2;;123132;128;;ASA;X value;;;;;;;;;;;;;
column1;column2;;45643123;128;;TT;9 someting;;;;;;;;;;;;;
column1;column2;;456464;128;;KK;VALUE 9 VALUE;;;;;;;;;;;;;
column1;column2;;4646;128;;ST;value 6;;;;;;;;;;;;;
column1;column2;;456464;128;;NX;7 something;;;;;;;;;;;;;

我想在第8列中找到一个特定的值/字符串,并将其替换为其他内容。我遇到的问题是,我找不到一个sed或awk工作,只有当它得到完全匹配时才编辑第8列。

我希望得到这样的东西(不起作用):

awk -F";" '$8=="value" {gsub(/$8/,"column 8");print;}' infile.csv >outfile.csv

如果我在第8列中获得字符串“value”的完全匹配,我希望编辑整个第8列。所以我不希望第8列的“值值”或“X值”发生变化。

如果它是sed或awk命令并不重要,如果可能,我更喜欢直接编辑文件而不是使用输入/输出文件。匹配的字符串有可能出现在其他列中,这就是为什么它也很重要我只在第8列中搜索。

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:4)

gsub不需要单独的条件 - 你只需将它应用于每条记录,它就不会为那些不匹配的人做任何事情:

awk -F\; -v OFS=";" '{gsub(/value/,"column 8",$8)}1' infile.csv > outfile.csv

非常重要逃避 / 引用 ;,以便它不被解释贝壳!另外,正如评论中所指出的(感谢),您还需要设置输出字段分隔符,以便awk触及的行保持分号分隔。

如果需要,可以通过将模式更改为/^value$/来将锚点添加到字段的开头和结尾以进行完全匹配。

最后的1只是print的简写(因为它始终为true,默认操作是打印记录)。

答案 1 :(得分:1)

使用sed

sed -i 's/^\(\([^;]*;\)\{7\}\)value;/\1column 8;/' file

捕获捕获组中的前七个字段,检查第8个字段是否正确,然后用捕获字符串和替换文本替换字符串。

-i适用于inplace