同じファイルの形式を変更してファイル名を挿入するにはどうすればよいですか?

同じファイルの形式を変更してファイル名を挿入するにはどうすればよいですか?

ファイルがたくさんあります。ファイル形式は年(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/ -> / /->1 つの空白スペースに置き換えられます。

出力は次のようになります。

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

関連情報