awk를 사용하여 타임스탬프를 분해하고 형식을 지정하세요.

awk를 사용하여 타임스탬프를 분해하고 형식을 지정하세요.

다음과 같은 파일 이름의 경우:

fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt

내가 달성하려는 것은 awk파일 이름을 분리한 .xml다음 csv/데이터베이스에서 사용하기 위해 타임스탬프를 분리하고 형식을 지정하는 것입니다.

나는 다음을 가지고 있습니다 :

NR==1 {
    fn=substr(FILENAME, 0, FILENAME-5);
    ts=fn;                                                                                                                                                                                                
    sub(/[0-9]{4}.*$/,"",fn);                                                                                      
    sub(/^\w+\.xml/,"",ts);
} {
     printf "fn\tts"
}

끝에서 "-"를 제거할 수 있지만 나머지 타임스탬프를 2017-11-30 21:00:59.

답변1

이것은 작동합니다. 개인적으로 awk를 사용하지는 않지만 정확한 유형 조작을 쉽게 만드는 몇 가지 훌륭한 기능이 있는 gawk, gensub()를 사용합니다.

echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | awk '{
  gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
  date=$0; 
  time=$0; 
  sub(/[-_][0-9]{2}_[0-9]{2}_[0-9]{2}$/,"",date); 
  sub(/^[0-9]{4}-[0-9]{2}-[0-9]{2}[-_]/,"",time);
  gsub(/_/,":",time);
  print date " "  time 
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59

awk를 지정했으므로 이는 다소 기본적이긴 하지만 하나의 접근 방식입니다.

gensub 누락으로 인해 $0 값을 두 보유자에게 전송하여 한 보유자의 시작 부분과 다른 보유자의 끝 부분을 제거할 수 있습니다.

보시다시피 초기 시작/종료를 쉽게 제거하고 추가 처리를 위해 날짜/시간 데이터만 남겨 두는 것이 쉽습니다.

gawk와 gensub를 사용하는 것이 더 쉽습니다.

echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | gawk '{
  gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
  datetime = gensub(/^([0-9-]{10})[-_]([0-9_]{8})$/,"\\1 \\2",1,$0);
  gsub(/_/,":",datetime);
  print datetime 
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59

시작/끝 패턴은 동일한 작업을 수행합니다. 하나는 실제 패턴을 가져와 복사하고, 두 번째는 [0-9-]와 일치하는 처음 10개와 [0-9_]와 일치하는 마지막 8개를 제공합니다. 내용과 일치하는지 여부는 어느 것이 더 읽기 쉬운지에 달려 있습니다.

진짜 질문은 이것이 Perl을 사용하는 것이 더 나은지 여부입니다.

관련 정보