sed:csvファイル列の小数点以下の切り捨て

sed:csvファイル列の小数点以下の切り捨て

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

関連情報