我有一个包含多列和 1000 条记录的 CSV 文件,我需要在其中一列(比如第二列)的所有值'
前面加上撇号,除了第一行或标题行,可能有一个简单的单行为了这。我怎样才能使用awk
or实现这一目标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)
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)
这是一个傻瓜:
$ gawk -F'","' -v var="'" -v OFS='","' 'NR>1{$2=var$2;} 1' foo.csv
Run Code Online (Sandbox Code Playgroud)
该-v
选项允许您定义gawk
脚本可访问的变量。在这种情况下,var
is'
和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
与","
和打印生成的字符串。
使用 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)
这假设您的字段不包含反斜杠转义的引号。
归档时间: |
|
查看次数: |
1671 次 |
最近记录: |