1つの列を削除する必要があるCSVファイルがあります。問題は、ヘッダーなしでCSVファイルをエクスポートしたことです。たとえば、CSVファイルから列を削除するにはどうすればよいですか。たとえば、example.csvブールデータである最後の列を削除し、ファイルをinput.csvにしたいとします。
input.csv
1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE
output.csv
1,"data",100.00
2,"code",91.8
3,"analytics",100.00
4列目を削除するには、
$ cut -d, -f4 --complement example.csv > input.csv
列番号と一致するように-fオプションを調整します。
CSVファイルがより複雑な場合は、PerlとText :: CSVパッケージを使用できます。
$ Perl -MText :: CSV -E '$ csv = Text :: CSV-> new({binary => 1}); while($ row = $ csv-> getline(STDIN)) { print "$ row-> [0]、$ row-> [1]、$ row -> [2]\n " } '<example.csv> input.csv
sed
:
_sed 's/,[^,]\+$//' file.csv
_
,[^,]\+
_は_,
_に一致し、その後に_,
_を除く任意の数の文字が続き、一致は空の文字列に置き換えられますawk
:
_awk -F, '{for(i=1; i<NF; i++) printf("%s%s", $i, FS); print ""}' file.csv
_
_-F,
_はフィールド区切り文字を_,
_として設定します
for(i=1; i<NF; i++) printf("%s", $i); print ""
最後のフィールドを除くフィールドを反復処理し、出力を目的の形式で出力します
例:
_% cat file.txt
1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE
% sed 's/,[^,]\+$//' file.txt
1,"data",100.00
2,"code",91.8
3,"analytics",100.00
% awk -F, '{for(i=1; i<NF; i++) printf("%s%s", $i, FS); print ""}' file.txt
1,"data",100.00,
2,"code",91.8,
3,"analytics",100.00,
_
Pythonでcsvモジュールを使用します。
python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
w.writerow(row[0:-1])' < input.csv > output.csv
出力に、列2、3、1の順に含める場合は、次のように使用します。
python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
w.writerow([row[1], row[2], row[0]])' < input.csv > output.csv
Python配列インデックスは0から始まるため、列番号も上記の0から始まります。そのため、列2、3、1はそれぞれ1、2、0です。
cut -d "," -f 4 --complement input.csv > output.csv
ここでは、-dの後に区切り文字、つまり二重引用符で囲まれたセミコロン(;)が続き、-fの後に削除する列の番号が続きます。つまり、4。列番号は1から始まり、このコンテキストで続行されます。
CSV形式は扱いにくい場合があります。CSVパーサーを使用する方法です。
単純化したアプローチで、最後のフィールドを削除します。
1)Awkで最後のフィールドを削除する
awk 'BEGIN{FS=OFS=","}{NF--;print}'
2)Perlの正規表現
Perl -pe 's/.*\K,.*//'
最後の文字の数を削除する非常に一般的なソリューション:
awk '{print substr($0, 1, length($0)-5)}' list1.txt
1,"data",100.00
2,"code",91.8
3,"analytics",100.00
-5
は削除される文字の数です
このawkコマンドで列番号を変更するだけです。以下のコマンドは、3番目の列を削除します。 ($ 3)
awk -F, '{$3=""}1' OFS=, test.txt | sed "s/^,//;s/,$//;s/,,/,/"