次の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では行末を。