파일이 많습니다. 파일 형식은 연(4자리)월(2자리)일(2자리)입니다.
샘플 파일 이름:
- 20150101.txt
- 20150102.txt
샘플 파일 이름의 내용
00:00:13 -> 001528
파일 이름에서 데이터를 날짜로 추출한 다음 파일에 삽입하고 싶습니다.
원하는 출력
2015-01-01T00:00:13 001528
또는
2015-01-01 00:00:13 001528
아래 코드 중 하나를 시도했습니다.
for files in *txt; do
awk -F "->" 'BEGIN{OFS=""} {print FILENAME" ",$1, $2}' <$files > $files.edited
mv $files.edited $files
done
안내해주세요.
답변1
GNU awk( )가 있다면 gawk
내장된 기능을 사용할 수 있습니다.시간 함수파일 이름과 내용을 에포크 시간으로 변환한 다음 선택한 형식에 따라 변환합니다.
전. 주어진
$ cat 20150101.txt
00:00:13 -> 001528
그 다음에
$ awk -F ' -> ' '
split($1,a,/:/) {
ds = sprintf("%04d %02d %02d %02d %02d %02d", substr(FILENAME,1,4), substr(FILENAME,5,2), substr(FILENAME,7,2), a[1], a[2], a[3]);
$1 = strftime("%FT%T", mktime(ds))
}
1
' 20150101.txt
2015-01-01T00:00:13 001528
답변2
그러면 다음을 사용하여 원하는 출력이 제공됩니다 sed
.
for files in *.txt; do
sed -e "s/^./$files&/;s/./&-/4;s/./&-/7;s/.txt/T/;s/ -> / /" "$files"
done
실제로 각 출력을 각 파일에 삽입하기 위해 루프에서 했던 것처럼 리디렉션할 필요가 없습니다. -i
대신 옵션 을 사용해도 됩니다 -e
.
- 그만큼
s
(대체) 명령다음 구문을 사용합니다.s/regexp/replacement/flags
.
모든 문자와 일치하며^.
줄의 첫 번째 문자와 일치합니다.&
역참조패턴 공간의 전체 일치 부분s/^./$files&/
첫 번째 문자 앞의 파일 이름으로 첫 번째 문자를 대체하라는 메시지가 표시됩니다.s/./&-/4
을 사용합니다숫자 플래그4
4번째 문자( 의 4번째 일치.
)를-
4번째 문자 이후 로 대체하려면s/./&-/7
7번째 문자를 7번째 문자 이후로 바꿉니다 (참고로 4번째 문자 뒤에-
삽입하면 6번째 문자가 7번째 문자가 됩니다 ).-
그리고 물론,
s/.txt/T/
.txt
으로 대체T
하고s/ -> / /
->
하나의 공백으로 대체됩니다 .
출력은 다음과 같습니다.
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528