sed 명령 교환 문자

sed 명령 교환 문자

내 입력 파일 레이아웃은 다음과 같습니다. 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무시될 수 있습니다 . 다음으로, -패턴 공간에서 다음 번 쉼표가 발생하기 전에 ^쉼표가 아닌 연속 문자가 인용됩니다. \21차 교체 결과는 경기 전 투입했다 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

관련 정보