내 입력 파일 레이아웃은 다음과 같습니다. mm/dd/yyyy,hh:mm,other fields
형식을 다음과 같이 지정해야 합니다. yyyy-mm-dd hh:mm:00,other fields
입력 예:
01/02/1998,09:30,0.4571,0.4613,0.4529,0.4592,6042175
01/02/1998,09:45,0.4592,0.4613,0.4529,0.4571,9956023
01/02/1998,10:00,0.4571,0.4613,0.455,0.4613,8939555
01/02/1998,10:15,0.4613,0.4697,0.4571,0.4697,12823627
01/02/1998,10:30,0.4676,0.4969,0.4613,0.4906,28145145
예제 출력:
1998-01-02 09:30:00,0.4571,0.4613,0.4529,0.4592,6042175
etc...
나는 다음을 사용하려고합니다 :
sed -r 's/\(^[0-9][0-9])\(\/[0-9][0-9]\/)\(\/[0-9][0-9][0-9][0-9],)/\3\1\2/g
답변1
sed -e 's/\(..\)\/\(..\)\/\(....\),\(.....\),\(.*\)/\3-\1-\2 \4:00,\5/'
다음 의견의 입력을 포함하도록 편집되었습니다.
sed -e 's#\(..\).\(..\).\(....\),\(.....\),#\3-\1-\2 \4:00,#'
답변2
이것은 나에게 효과적입니다.
sed -r 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4}),([0-9:]{5})/\3-\1-\2 \4:00/g'
2자리 숫자( ([0-9]{2})
), 슬래시, 2자리 숫자( ([0-9]{2})
), 슬래시, 4자리 숫자( ([0-9]{4})
), 숫자 및 :
( ([0-9:]{5})
)를 일치시킵니다. 원하는 순서( \3-\1-\2 \4:00
년-월-일 시:분:00)로 바꿉니다.
답변3
sed 'y|/|-|
s/,*\(.....\)-*\([^,]*\)/\2-\1/
s// \1:00/2
' <infile
산출:
1998-01-02 09:30:00,0.4571,0.4613,0.4529,0.4592,6042175
1998-01-02 09:45:00,0.4592,0.4613,0.4529,0.4571,9956023
1998-01-02 10:00:00,0.4571,0.4613,0.455,0.4613,8939555
1998-01-02 10:15:00,0.4613,0.4697,0.4571,0.4697,12823627
1998-01-02 10:30:00,0.4676,0.4969,0.4613,0.4906,28145145
일반적으로 sed
그렇게까지 노력할 필요는 없습니다. 찾고 있는 일치 항목을 명시적으로 열거하려고 시도하는 것은 일반적으로 보람이 없습니다. 대신, 일부 랜드마크(구분자)를 지정하고 패턴이 전환을 처리하도록 하는 것이 훨씬 더 간단한 경우가 많습니다.
위의 내용은 sed
먼저 문자를 y///
문자로 변환합니다. 다음으로 쉼표가 아닌 첫 번째 부분을 인용합니다./
-
(최소 5개 이상인 경우)패턴 공간의 문자와 다음 4개의 문자는 \1
무시될 수 있습니다 . 다음으로, -
패턴 공간에서 다음 번 쉼표가 발생하기 전에 ^
쉼표가 아닌 연속 문자가 인용됩니다. \2
1차 교체 결과는 경기 전 투입했다 mm-dd
가 투입하는 것이다. 그래서 우리는 그것들을 교환하고, 다음과 같이 반대편에 새로운 것을 삭제하고 삽입합니다:\1
-
yyyy
\2
-
s/.../\2-\1/
마지막으로 다시 해보겠습니다. 동일한 패턴을 다른 목적으로 재사용합니다. 내가 할 때 :
s// \1:00/2
sed
마지막 정규식을 재사용하도록 지시했습니다.(빈 주소로 표시됨 //
)하지만 이번에는 패턴 공간에서 두 번째로 나타나는 패턴을 찾으려고 합니다.하다이 시간과 쉼표 일치 ,*
- 이 필드와 마지막 필드를 구분하는 쉼표를 일치시킵니다. 그것도 HH:MM
일치 \1
하고(문자열 뒤에 쉼표가 있기 때문입니다)''
에 빈 문자열이 있습니다 \2
. 남은 것은 \1
그것을 그 자체로 교체하는 것입니다<스페이스>이후:00끈. 중간에 있는 쉼표와 빈 문자열은 편집됩니다.
당신이 당신을 느낀다면회의하지만 결국 좀 더 구체적이니까, 좀 더 추상적이면 생각하기가 훨씬 쉬울 수도 있겠네요. 정규식이 제공하는 주요 이점은 처음에 반복 작업의 원인을 명확하게 이해하는 한 반복 작업을 빠르고 효율적으로 추상화할 수 있는 방법을 제공한다는 것입니다.
정규식을 작성하는 것 자체가 반복적인 작업이 된다면 음... 뭔가 빠진 것일 수도 있습니다. 그러나 간단한 정규식 구문의 장점 중 하나는 다음과 같습니다.또한일반적으로 추상화에 적합한 후보이며 구현하기 쉽습니다.
예를 들어:
d='[0-9][0-9]' T=$d:$d m=$d y=$d$d
sed -E "s|($m/$d)/($y),($T)|\2-\1 \3:00|;s|/|-|"
답변4
그리고 가능한 awk
해결책:
awk 'BEGIN { FS = OFS = ","; } { split($1, d, "/"); $2 = d[3] "-" d[1] "-" d[2] " " $2 ":00"; $1 = ""; } { for (i = 2; i < NF; i++) printf("%s", $i OFS); printf("%s", $NF ORS);}' file