毎日約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番目の新しいフィールドが行の末尾に追加されます。次に、新しい行を印刷します。