형식을 동일한 파일로 변경하여 파일 이름을 삽입하는 방법은 무엇입니까?

형식을 동일한 파일로 변경하여 파일 이름을 삽입하는 방법은 무엇입니까?

파일이 많습니다. 파일 형식은 연(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을 사용합니다숫자 플래그 44번째 문자( 의 4번째 일치 .)를 -4번째 문자 이후 로 대체하려면
  • s/./&-/77번째 문자를 7번째 문자 이후로 바꿉니다 (참고로 4번째 문자 뒤에 -삽입하면 6번째 문자가 7번째 문자가 됩니다 ).-

그리고 물론,

  • s/.txt/T/.txt으로 대체 T하고
  • s/ -> / /->하나의 공백으로 대체됩니다 .

출력은 다음과 같습니다.

2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528

관련 정보