awk
レポートの日付と時刻のフィールドを埋めるためにこれを使用したいと思います。これは実際にタブで区切られた現在の.csvです。
AA 9/7/2014 2:30:38 PM AA0000011111 08 Y A Jane, Doe
AA 9/7/2014 11:30:31 AM AA0000011112 09 Y B John, Doe
AA 9/7/2014 7:30:45 AM AA0000011113 20 Y A Jane, Doe A
AA 9/8/2014 11:01:14 AM AA0000011114 30 Y A John, Doe A
AA 9/8/2014 2:30:46 PM 7BD1111111115 40 Y B Jane, Doe A
AA 9/8/2014 2:31:00 PM AA0000011116 50 Y A John, Doe A
AA 9/8/2014 7:30:53 AM AA0000011117 60 Y B Jane, Doe
AA 9/9/2014 7:30:27 AM AA0000011118 70 Y A John, Doe A
AA 9/9/2014 7:30:41 AM AA0000011119 80 Y B Jane, Doe
AA 9/9/2014 7:30:55 AM AA0000011110 90 Y A John, Doe
AA 9/14/2014 7:30:55 AM AA0000011111 80 Y A Jane, Doe A
AA 11/11/2014 7:30:55 AM AA0000011112 80 Y A John, Doe A
読みやすく簡単にするために、すべての日付と時刻を入力したいと思います。このように:
AA 09/07/2014 02:30:38 PM AA0000011111 08 Y A Jane, Doe
AA 09/07/2014 11:30:31 AM AA0000011112 09 Y B John, Doe
AA 09/07/2014 07:30:45 AM AA0000011113 20 Y A Jane, Doe A
AA 09/08/2014 11:01:14 AM AA0000011114 30 Y A John, Doe A
AA 09/08/2014 02:30:46 PM 7BD1111111115 40 Y B Jane, Doe A
AA 09/08/2014 02:31:00 PM AA0000011116 50 Y A John, Doe A
AA 09/08/2014 07:30:53 AM AA0000011117 60 Y B Jane, Doe
AA 09/09/2014 07:30:27 AM AA0000011118 70 Y A John, Doe A
AA 09/09/2014 07:30:41 AM AA0000011119 80 Y B Jane, Doe
AA 09/09/2014 07:30:55 AM AA0000011110 90 Y A John, Doe
AA 09/14/2014 07:30:55 AM AA0000011111 80 Y A Jane, Doe A
AA 11/11/2014 07:30:55 AM AA0000011112 80 Y A John, Doe
答え1
awk
GNU実装があるmawk
1.3.4-20121129以上、努力する:
$ awk '
{
split($2,a,"/");
split($3,b,":");
split(strftime("%m/%d/%Y %H:%M:%S",mktime(a[3]" "a[1]" "a[2]" "b[1]" "b[2]" "b[3])),c);
$2 = c[1];
$3 = c[2];
print;
}
' file
AA 09/07/2014 02:30:38 PM AA0000011111 08 Y A Jane, Doe
AA 09/07/2014 11:30:31 AM AA0000011112 09 Y B John, Doe
AA 09/07/2014 07:30:45 AM AA0000011113 20 Y A Jane, Doe A
AA 09/08/2014 11:01:14 AM AA0000011114 30 Y A John, Doe A
AA 09/08/2014 02:30:46 PM 7BD1111111115 40 Y B Jane, Doe A
AA 09/08/2014 02:31:00 PM AA0000011116 50 Y A John, Doe A
AA 09/08/2014 07:30:53 AM AA0000011117 60 Y B Jane, Doe
AA 09/09/2014 07:30:27 AM AA0000011118 70 Y A John, Doe A
AA 09/09/2014 07:30:41 AM AA0000011119 80 Y B Jane, Doe
AA 09/09/2014 07:30:55 AM AA0000011110 90 Y A John, Doe
AA 09/14/2014 07:30:55 AM AA0000011111 80 Y A Jane, Doe A
AA 11/11/2014 07:30:55 AM AA0000011112 80 Y A John, Doe A
説明する
- 日付文字列を分割して配列に保存します。
a
- 時間文字列を分割して配列に保存します。
b
次のセクションでは、
strftime
summktime
関数を使用して目的の結果を取得します。mktime(a[3]" "a[1]" "a[2]" "b[1]" "b[2]" "b[3])
Year Month Day Hour Min Sec
エポック以降の時間を秒に変換するための書式付き文字列を取得します。strftime
"%m/%d/%Y %H:%M:%S"
フォーマットと時間を処理すると、目的のmktime
結果が生成されます。
結果を分割して配列に保存し、
c
再割り当てし$2
て$3
印刷します。
ノート
答え2
awkでは、printf修飾子を使用して幅とゼロのパディングを指定できます。
$ awk -F'[/:]| +' '{ printf "%s %02d/%02d/%02d %02d:%02d:%02d %s %-13s %s %s %s %s %s %s\n",
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 } ' input_file
AA 09/07/2014 02:30:38 PM AA0000011111 08 Y A Jane, Doe
AA 09/07/2014 11:30:31 AM AA0000011112 09 Y B John, Doe
AA 09/07/2014 07:30:45 AM AA0000011113 20 Y A Jane, Doe A
AA 09/08/2014 11:01:14 AM AA0000011114 30 Y A John, Doe A
AA 09/08/2014 02:30:46 PM 7BD1111111115 40 Y B Jane, Doe A
AA 09/08/2014 02:31:00 PM AA0000011116 50 Y A John, Doe A
AA 09/08/2014 07:30:53 AM AA0000011117 60 Y B Jane, Doe
AA 09/09/2014 07:30:27 AM AA0000011118 70 Y A John, Doe A
AA 09/09/2014 07:30:41 AM AA0000011119 80 Y B Jane, Doe
AA 09/09/2014 07:30:55 AM AA0000011110 90 Y A John, Doe
AA 09/14/2014 07:30:55 AM AA0000011111 80 Y A Jane, Doe A
AA 11/11/2014 07:30:55 AM AA0000011112 80 Y A John, Doe A
答え3
以下も使用できますsed
。
sed -e :1 -e 's|^\([^:]*[ /]\)\([0-9][/:]\)|\10\2|;t1'
最初の後続のセクションのスペースまたはまたは間/
の/
1桁の数字の前に0を挿入します。:
: