如何匹配和更改分号分隔文件的列中的字符串?
How to match and change strings in a column of a semicolon separated file?
我有一个以分号分隔的 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 列中找到特定的 value/string,并将其替换为其他内容。我遇到的问题是我找不到一个 sed 或 awk 来编辑第 8 列,只有当它得到完全匹配时。
我想达到这样的效果(不起作用):
awk -F";" '=="value" {gsub(//,"column 8");print;}' infile.csv >outfile.csv
如果我在第 8 列中得到与字符串 "value" 完全匹配的结果,我希望编辑整个第 8 列。所以我不希望第 8 列有 "value value" 或 "X value" 改变。
无论是 sed 还是 awk 命令都没有关系,如果可能的话我更喜欢直接编辑文件而不是使用 in/out-file。匹配的字符串有可能出现在其他列中,这就是为什么它也很重要我只在第 8 列中搜索。
知道如何做到这一点吗?
gsub
不需要单独的条件 - 您可以将它应用于每条记录,它不会对不匹配的记录执行任何操作:
awk -F\; -v OFS=";" '{gsub(/value/,"column 8",)}1' infile.csv > outfile.csv
非常重要,您 转义/引用 ;
这样它就不会被 shell 解释!此外,正如评论中指出的(谢谢),您还需要设置输出字段分隔符,以便 awk 接触的行保持分号分隔。
如果需要,您可以通过将模式更改为 /^value$/
.
将锚点添加到字段的开头和结尾以实现完全匹配
末尾的 1
只是 print
的 shorthand(因为它始终为真,默认操作是打印记录)。
使用 sed
sed -i 's/^\(\([^;]*;\)\{7\}\)value;/column 8;/' file
这会捕获捕获组中的前七个字段,检查第 8 个是否是正确的值,然后用捕获字符串和替换文本替换该字符串。
-i
用于就地
我有一个以分号分隔的 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 列中找到特定的 value/string,并将其替换为其他内容。我遇到的问题是我找不到一个 sed 或 awk 来编辑第 8 列,只有当它得到完全匹配时。
我想达到这样的效果(不起作用):
awk -F";" '=="value" {gsub(//,"column 8");print;}' infile.csv >outfile.csv
如果我在第 8 列中得到与字符串 "value" 完全匹配的结果,我希望编辑整个第 8 列。所以我不希望第 8 列有 "value value" 或 "X value" 改变。
无论是 sed 还是 awk 命令都没有关系,如果可能的话我更喜欢直接编辑文件而不是使用 in/out-file。匹配的字符串有可能出现在其他列中,这就是为什么它也很重要我只在第 8 列中搜索。
知道如何做到这一点吗?
gsub
不需要单独的条件 - 您可以将它应用于每条记录,它不会对不匹配的记录执行任何操作:
awk -F\; -v OFS=";" '{gsub(/value/,"column 8",)}1' infile.csv > outfile.csv
非常重要,您 转义/引用 ;
这样它就不会被 shell 解释!此外,正如评论中指出的(谢谢),您还需要设置输出字段分隔符,以便 awk 接触的行保持分号分隔。
如果需要,您可以通过将模式更改为 /^value$/
.
末尾的 1
只是 print
的 shorthand(因为它始终为真,默认操作是打印记录)。
使用 sed
sed -i 's/^\(\([^;]*;\)\{7\}\)value;/column 8;/' file
这会捕获捕获组中的前七个字段,检查第 8 个是否是正确的值,然后用捕获字符串和替换文本替换该字符串。
-i
用于就地