从带有重音字符的逗号分隔文本中删除字段

从带有重音字符的逗号分隔文本中删除字段

我有一个像这样的 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 中,您告诉将行尾替换为 ;

相关内容