如何使用撇号 ( ' ) 为列值添加前缀?

Dhr*_*uuv 4 linux sed awk csv

我有一个包含多列和 1000 条记录的 CSV 文件,我需要在其中一列(比如第二列)的所有值'前面加上撇号,除了第一行或标题行,可能有一个简单的单行为了这。我怎样才能使用awkor实现这一目标sed?请注意,我可能在用双引号括起来的值中有多个逗号。

样本数据:

"col1","col2","col3","col4","col5"
"value11","value12","value13","value14","value15"
"value21","value22","value23","value24","value25"
"value31","value32","value33","value34","value35"
Run Code Online (Sandbox Code Playgroud)

预期输出:

"col1","col2","col3","col4","col5"
"value11","'value12","value13","value14","value15"
"value21","'value22","value23","value24","value25"
"value31","'value32","value33","value34","value35"
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 5

sed:

sed '2,$s/^\("[^"]*","\)/\1'"'"/ test.in
Run Code Online (Sandbox Code Playgroud)

使用 ERE 摆脱一些转义:

sed -E '2,$s/^("[^"]*",")/\1'"'"/ test.in
Run Code Online (Sandbox Code Playgroud)

awk:

awk -F, 'NR>1{sub(/^"/,"\"'"'"'",$2)}1' test.in
Run Code Online (Sandbox Code Playgroud)

如果您不想担心引用,请使用转义码:

awk -F, '{sub(/^"/,"\"\x27",$2)}1' test.in
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

这是一个傻瓜:

$ gawk -F'","' -v var="'" -v OFS='","' 'NR>1{$2=var$2;} 1' foo.csv 
Run Code Online (Sandbox Code Playgroud)

-v选项允许您定义gawk脚本可访问的变量。在这种情况下,varis'OFS(输出字段分隔符) is ",",与输入字段分隔符 ( -F) 相同。然后我们检查这不是第一行 ( NR>1) 并将 的值添加var到第二列。最后,这1只是一个技巧,它评估为真,这使得gawk打印该行。相当于加了一个print;但更短。

如果你想在不同的列运行它,只需更改$2=var$2;$N=var$N哪里N是你感兴趣的列数。


您也可以在 perl 中执行此操作(当然,您可以在 perl 中执行所有操作):

$ perl -F'\",\"' -ane '$.>1 && do{$F[1]=chr(39).$F[1]}; 
                       print join("\",\"",@F)' foo.csv
Run Code Online (Sandbox Code Playgroud)

-a开关使 perl 像 gawk 一样拆分输入行,只是将它们保存在数组中@F(perl 数组从 0 开始,因此第二列将是$F[1],第三列$F[2]等)。的-F(再次像gawk)设置输入字段分隔符。因此,我们检查行号是否大于一 ( $.>1),如果是,则将chr 39(a ',感谢 @josephR)的值添加到它。最后,我们使用join的每个元素在阵列中的连接@F","和打印生成的字符串。


Jos*_* R. 5

使用 Perl:

perl -pi -e '
             BEGIN{
                 $column_number = 2; # Change as needed
                 $column_number--;
                 $apostrophe = chr 39;
             }
             next unless $this_is_data++; # Skip the first line
             s@ ^((?:"[^"]+"\s*,){$column_number}) "@$1"$apostrophe@x
           ' your_file
Run Code Online (Sandbox Code Playgroud)

这假设您的字段不包含反斜杠转义的引号。

  • 我喜欢 Perl 并且每天都在使用它,但是当这些解决方案被发布时,就像看着一艘航空母舰拉起护卫舰战斗 8-)。 (3认同)