我有一个像这样的 CSV 文件
name;address;phone;email
John;123 La Sierra;555-121212;[email protected]
Nick;456 La Bongaa;555-121232;[email protected]
Carl;789 La Fountain;553-121212;[email protected]
我想删除最后一个条目,使其像
name;address;phone;
John;123 La Sierra;555-121212;
Nick;456 La Bongaa;555-121232;
Carl;789 La Fountain;553-121212;
最后一个;
必须保留在那里,但最后一个字段被删除。
我在我的一个问题上找到了这段代码并适应了这种情况
perl -000ne '@f=split(/;/); print join(";",@f[0..2]) , "\n"' myFile.csv
我以为它会拆分;
然后仅连接字段 0、1 和 2,但它不起作用。
file
命令给了我这个结果myFile.csv
UTF-8 Unicode text, with CRLF line terminators
该文件包含我认为可能会干扰此操作的重音字符。
有任何想法吗?
答案1
由于我不确定您是否perl
非常需要代码,因此这里有一个类似的awk
代码:
awk -F';' -v OFS=';' '{ $NF=""; print }' data.csv
=> 此代码清空每行的最后一个字段 ( $NF=""
)。输入字段 ( -F\;
) 和输出字段 ( OFS=';'
) 用“;”分隔。
与以下相同sed
:
sed 's/[^;]*$//' data.csv
=> 这会替换 ( s/.../.../
) 不是“;”的最长字符序列( [^;]*
) 行的末尾 ( $
) 没有任何内容。
与以下相同grep
:
grep -o '.*;' data.csv
=>grep
正则表达式默认是贪婪的,这意味着它们匹配可能的最长序列。因此,这里的.*;
意思是“以“;”结尾的最长字符序列。该-o
选项输出匹配的内容而不是整行。
最后,perl
等效的内容是(感谢@steeldriver):
perl -F';' -lpe '$F[-1]=""; $_ = join ";", @F' data.csv
=> 它的工作原理与 类似awk
,这里的连接是明确的。
答案2
方式bash
及使用shell parameter expansion
:
"${line%;*};"
答案3
不剪吗? :(
如果您要使用 CSV 文件,切一定会成为朋友:
cut -f 1-3 -d';' semico.csv | xargs -I{} echo {}";"
细分:剪切(提取)第 1 至 3 列,用“;”分隔然后对于每一行(因为 cut 会删除最后一个 ';',将其传递给 xargs 并 echo line + ;
肯定比 grep 慢,但从长远来看,最好使用正确的工具来完成这项工作
替代方案是因为人们对 xargs 不满意:
cut -f 1-3 -d';' semico.csv | sed 's/$/;/'
同样的事情,但是在 sed 中,您告诉将行尾替换为 ;