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'
첫 번째 로 이어지는 섹션의 공백 또는 /
및 또는 /
사이의 한 자리 숫자 앞에 0을 삽입합니다 .:
: