我有一个分号分隔的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列中搜索。
任何想法如何做到这一点?
答案 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