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

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

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

答え2

方法bashと用途shell parameter expansion:

"${line%;*};"

答え3

カットしたくない? :(

CSVファイルを使用したい場合は、切る確かに友達になります:

cut -f 1-3 -d';' semico.csv | xargs -I{} echo {}";"

分解: ';'で区切られた列1〜3を切り取り(抽出してから)、各行ごとに(カットは最後の ';'を削除するため、xargsに渡し、echo line +;

確かにgrepより遅いですが、長期的には仕事に適したツールを使用する方が良いです。

人々がxargsに満足していないので、代わり: cut -f 1-3 -d';' semico.csv | sed 's/$/;/'

同じことですが、sedでは行末を。

関連情報