もう一つのsed質問

もう一つのsed質問

毎日約200〜50GBのCSVファイルをエクスポートします。各CSVファイルの最初のフィールドは同様の日付情報です。各CSVファイルには22のフィールドがあります。

/data/exported$ head  0000_processmessages_export_20170509_000144.csv | awk -F ";" '{print $1}'
2017-05-08T21:59:10.263Z
2017-05-08T21:59:10.000Z
2017-05-08T21:59:10.000Z
2017-05-08T18:59:11.000Z
2017-05-08T18:59:11.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z

したがって、デフォルトではcsvファイルの各行の末尾に2つのフィールド(Field22とField23)を追加したいと思います。これらのフィールドはYYYYDMMHHやYYYYMMDDなどの形式であり、行の最初のフィールドから抽出する必要があります。だから

Field 23    Field 24 
2017050821  20170508
2017050821  20170508
2017050821  20170508
2017050818  20170508
2017050818  20170508
2017050821  20170508
2017050821  20170508
2017050821  20170508
2017050821  20170508
2017050821  20170508

sedおよび/またはbashコマンドを使用してこれをどのように実行できますか?

答え1

コメントで述べたように、そのような重複した情報を持つことは愚かなようです。ただし、これを行う必要がある場合は、キャプチャグループと逆参照を使用してください。

sed 's/^\(....\)-\(..\)-\(..\)T\(..\).*/&;\1\2\3\4;\1\2\3/'

答え2

perl -F\; -pale '$_ .= join ";", q{}, $F[0] =~ tr/T-//dr =~ /^((\d{8})\d{2})/' CSV.file

答え3

あなたの入力は - 区切られているように見える;ので、出力も同様に区切られたいとします。

$ cat file.csv
2017-05-08T21:59:10.263Z;some;other;fields
2017-05-08T21:59:10.000Z;some;other;fields
2017-05-08T21:59:10.000Z;some;other;fields
2017-05-08T18:59:11.000Z;some;other;fields
2017-05-08T18:59:11.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
$ awk -F ';' -v OFS=';' '{ split($1,a,":"); gsub("[^0-9]","",a[1]); $(NF+1)=a[1]; $(NF+1)=substr(a[1],0,8); print}' file.csv
2017-05-08T21:59:10.263Z;some;other;fields;2017050821;20170508
2017-05-08T21:59:10.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:59:10.000Z;some;other;fields;2017050821;20170508
2017-05-08T18:59:11.000Z;some;other;fields;2017050818;20170508
2017-05-08T18:59:11.000Z;some;other;fields;2017050818;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508

プログラムawkは、最初の;区切り文字フィールドを取得します:。次に、フィールドの最初の部分(最初の部分の前のビット)から数字以外のすべての項目を削除し、:それを新しいフィールドとして最後に追加します。次に、最初の新しいフィールドの最初の8文字だけを含む2番目の新しいフィールドが行の末尾に追加されます。次に、新しい行を印刷します。

関連情報