Linux에서 한 줄의 숫자를 늘리는 가장 좋은 방법

Linux에서 한 줄의 숫자를 늘리는 가장 좋은 방법

많은 항목이 포함된 한 줄이 있는데 그 중에는 시간도 있습니다.

 ('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...

매번 몇 시간 씩 늘리고 싶습니다. 24시간 형식으로. 예를 10:30:00들어 15:30:00.

이 작업에 가장 적합한 범용 도구는 무엇입니까? 나는 다음과 같은 점에서 생각하고 있습니다.

  1. awk, sed..& 등 내가 모르는 시스템 유틸리티

  2. vim

  3. bash또는 Python 과 같은 스크립팅 언어`

이를 수행하는 정식 방법은 무엇입니까?

답변1

다시 한번 확인하기 위해:

vim대부분의 *nix 시스템에 있는 시스템 유틸리티(텍스트 편집기)입니다. awk, sed및 는 bash텍스트를 구문 분석하고 변경하는 데 사용할 수 있는 언어(또는 상황에 따라 도구)입니다.

무엇을 위해 시간을 늘려야 하며, 얼마나 자주 시간을 늘려야 합니까? 이러한 요소는 사용하려는 도구에 영향을 미칩니다. 어쨌든 이것은 SQL이 아니라고 가정하여 여러 부분으로 구성된 노력입니다.

  1. 먼저 문자열 내의 부분 문자열을 일치시킵니다. 정규식과 함께 awk, sed또는 를 사용하여 grep -e해당 하위 문자열을 가져올 수 있습니다.

  2. 이러한 값이 있으면 정수로 변환합니다(또는 Python과 같은 더 완전한 언어를 사용하는 경우 라이브러리를 사용하여 날짜/시간 값으로 변환할 수 있습니다). 해당 값을 변경하려면 필요한 계산(및 해당되는 경우 유효성 검사)을 수행해야 합니다.

  3. 마지막으로 대체된 값을 줄에 추가하고 변경된 파일을 저장합니다.

하지만 솔직히 이것은 다음과 같으 sql므로 다음을 사용하는 것이 훨씬 쉬울 수 있습니다.내장 도구해당 언어로 해당 값을 변경합니다.

답변2

좋은 힌트가 있어요이 답변수학적 연산과 일치 연산을 혼합할 수 있는 Perl, Python, Ruby 등과 같은 스크립팅 언어를 사용하여 저항이 가장 적은 경로를 제안합니다.

Perl을 사용한 빠른 해킹은 다음과 같습니다.

$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
    's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$

이 단순한 예에서는 숫자 문자 클래스( \d) 뒤에 반복 표시기(예: {2})가 사용되어 날짜의 위치 구성 요소를 캡처하고 시간 필드에 대해 맹목적으로 산술을 수행합니다. 이러한 유형의 솔루션은 시간 필드의 단순한 산술로 인해 하루가 넘어가지 않도록 데이터를 충분히 잘 알고 있는 경우에만 적합합니다.

@Lieven의 메시지에 따라 시간 필드가 오버플로될 때 올바른 날짜/시간 산술을 해결하기 위해 이 문제를 다시 검토하면 Perl 핵심 모듈 Time::Piece(Perl>5.8)을 사용할 수 있습니다.

$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
    perl -MTime::Piece -pe \
        's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
            Time::Piece->strptime($1, "%Y-%m-%d %T") \
            + (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$

이 예제 입력은 다음 날로 롤오버되는 시간 값의 적절한 처리를 보여주기 위해 업데이트되었습니다. Time::Piece명령줄에서 모듈을 가져와 입력의 날짜-시간과 일치시키고 Time::Piece날짜/시간 산술을 수행하기 위해 객체로 변환한 다음 원하는 출력 형식으로 다시 문자열화합니다.

관련 정보