Perl
從帶有重音字元的逗號分隔文本中刪除欄位
我有一個這樣的 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
,這裡的加入是明確的。