다음과 같은 파일 이름의 경우:
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을 사용하는 것이 더 나은지 여부입니다.