Perl

從帶有重音字元的逗號分隔文本中刪除欄位

  • August 15, 2017

我有一個這樣的 CSV 文件

name;address;phone;email
John;123 La Sierra;555-121212;john@doe.com
Nick;456 La Bongaa;555-121232;nick@doe.com
Carl;789 La Fountain;553-121212;carl@doe.com

我想刪除最後一個條目,使它像

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

該文件包含我認為可能會干擾這一點的重音字元。

有任何想法嗎?

由於我不確定您是否需要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,這裡的加入是明確的。

引用自:https://unix.stackexchange.com/questions/386123