アクセント文字を含むカンマ区切りのテキストからフィールドを削除する

アクセント文字を含むカンマ区切りのテキストからフィールドを削除する

次の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;

最後のフィールドは;そのまま残す必要がありますが、最後のフィールドは削除されます。

私の質問の1つでこのコードを見つけて、この状況に合わせて調整しました。

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ここで接続が明確です。

おすすめ記事