use*_*568 0 text-processing csv
CSV 文件:
A,12345,hello
B,67890,hi
A,123456,yo
Run Code Online (Sandbox Code Playgroud)
预期输出:如果第一列是:,则应在第二列末尾添加两个零A:
A,1234500,hello
B,67890,hi
A,12345600,yo
Run Code Online (Sandbox Code Playgroud)
如果您的数据是通用 CSV 文件,其中可能包含嵌入逗号、引号和换行符的字段,那么我们需要使用支持 CSV 的工具(例如Miller ( mlr))来进行转换:
$ mlr --csv -N put -S '$1 == "A" { $2 .= "00" }' file
A,1234500,hello
B,67890,hi
A,12345600,yo
Run Code Online (Sandbox Code Playgroud)
这会将您的数据读取为无标头 CSV 记录,并添加00到第二个字段的值的末尾(如果第一个字段的值为 )A。-S子命令的选项使putMiller 将所有记录视为字符串,无论它们是数字还是字符串。
Miller 可以使用其选项进行就地编辑-I。
如果您的数据采用无标头的简单CSV 格式,这意味着它不包含嵌入逗号、引号或换行符(需要在 CSV 中特殊引用的内容)的字段,您可以使用以下方法awk进行转换:
$ awk -F , 'BEGIN { OFS=FS } $1 == "A" { $2 = $2 "00" }; 1' file
A,1234500,hello
B,67890,hi
A,12345600,yo
Run Code Online (Sandbox Code Playgroud)
awk在这里,逗号分隔的字段由;读取。如果第一个字段是A,则字符串00将添加到第二个字段。尾随单独的输出1是awk(可能已修改的)记录。
sed并不真正适合以方便或易于维护的方式编辑结构化文档。如果您的数据采用无标头的简单CSV 表单,您可能可以通过匹配以 string 开头的行A,,并在这些行上第二次出现逗号之前插入两个零:
$ sed '/^A,/ s/,/00,/2' file
A,1234500,hello
B,67890,hi
A,12345600,yo
Run Code Online (Sandbox Code Playgroud)
...但请注意,它sed没有记录或字段的概念,并将每个输入行视为通用文本字符串。
在sed上面的表达式中,/^A,/是后续替换命令使用的地址s,这意味着该命令将应用于与该正则表达式匹配的所有行(以字符串 开头的行A,)。由于表达式末尾的 ,替换会匹配该行上的第二个逗号,并将其替换为字符串。200,
编辑器中的等效编辑命令ed是g/^A,/ s/,/00,/2(“将以下替换应用于与此正则表达式匹配的所有行”)。vi如果它理解2表达式末尾的 the (但它不理解),这也会起作用。