sedを使用してcsvファイル番号の小数部全体を削除しようとしています。私ができることは、ファイルの列全体ですべての小数点(たとえば.0)を切り捨てることです。しかし、6番目の列でのみこれを行う方法がわかりません。
入力する:
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28.0,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25.0,0,0,348123,7.65,F G73,S
予想出力:
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S
私の試み:
sed -r ‘s/\.0//g’ file.csv
答え1
ちょっとぎこちないけど仕事が終わったと思います。
Pythoncsvkit
パッケージCSVファイルを処理するためのコマンドラインツールが含まれています。とりわけ、csvcut
これは標準cut
コマンドのように機能しますが、CSVをサポートします。つまり、フィールドが正しく引用されている限り、フィールド区切り文字と改行を含めることができます。
を使用すると、編集csvcut
したい列を切り取り、修正してから元に戻すことができます。paste
フィールドを再整理するために、カンマを区切り文字として使用しました。このpaste
ユーティリティは、最初のいくつかのフィールド(未修正)、変更したいフィールド(sed
単純なスクリプトを使用して変更)、および最後のいくつかのフィールド(未修正)に対応する3つの入力ストリームを使用します。
paste -d, \
<( csvcut -c -5 file.csv ) \
<( csvcut -c 6 file.csv | sed '1!s/\..*//' ) \
<( csvcut -c 7- file.csv )
このsed
式は、1!s/\..*//
最初の行を除くすべての行から1つの点とその後のすべての内容を削除します。
これは、入力ファイル全体を3回読み取るため、少し効率的ではありません。
結果:
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S
答え2
sed
カンマを区切り文字として使用し、名前フィールドのカンマを区切り文字として使用しないと複雑すぎるため、これを行うことができず、次のawk
オプションgsub
を使用しました。
awk -F ',' 'NR==1; NR>1{gsub("\.0","",$7);print} ' OFS="," file
状況を考慮すると、少し混乱していますが、カンマを区切り文字に設定し、最初の行を印刷してから、最初の行の後のすべての行の名前など、7番目のフィールドの項目.0
に置き換えます。 The comma 実際に age を 7 番目のフィールドにし、出力フィールドの区切り文字をコンマに戻し、次を印刷します。
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S
答え3
CSVファイルで作業するときに直面する主な問題は、列タイプが文字列で文字列が(二重引用符)で囲まれている場合、列区切り文字が列値自体にある可能性があることです。
したがって、次のコマンドは次のようになります。
sed -r 's/^(([^,]*,){6})([^\.,]*)[^,]*(,.*)$/\1\3\4/g'
はい、ただしテキスト文字列にコンマがない場合にのみ適用されます。この状況に対処するには、以前のポスターで提案したものと同じツールが必要です。
答え4
シンプルアッageフィールドを最後から見る方法があるかもしれません。なぜなら、その終わりから始めると、フィールド内に区切り文字がないからです。
awk -F, -v OFS=, '
NR>1{$(NF-6) = int($(NF-6))}1
' file
使用sed拡張正規表現を使用して、-r
最後から始めてフィールド数を計算します。
sed -r '
s/\.0((,[^,]*){6})$/\1/
' file
出力:
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S