web-dev-qa-db-ja.com

同じファイルにフォーマットを変更してファイル名を挿入する方法は?

多くのファイルがあります。ファイル形式は年(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

ご案内ください。

3
chess_freak

これにより、sedを使用して目的の出力が得られます。

for files in *.txt; do
sed -e "s/^./$files&/;s/./&-/4;s/./&-/7;s/.txt/T/;s/ -> / /" "$files"
done

実際に各出力を各ファイルに挿入するために、ループで行ったようにリダイレクトする必要はありません。 -iの代わりに-eオプションを使用するだけです。

  • s(substitute)コマンド は次の構文を使用します:s/regexp/replacement/flags
  • .は任意の文字に一致し、^.は行の最初の文字に一致します
  • &back-references パターンスペースの一致した部分全体
  • s/^./$files&/は、最初の文字を、最初の文字の前のファイル名で置き換えるように言います
  • s/./&-/4数値フラグ4を使用して、4番目の文字(.の4番目の一致)を4番目の文字の後の-に置き換えます
  • s/./&-/7 7番目の文字を、7番目の文字の後の-に置き換えます(4番目の文字の後に-を挿入すると、6番目の文字が7番目の文字になることに注意してください)。

そしてもちろん、

  • s/.txt/T/.txtTで置き換え、
  • s/ -> / /は、->を1つの空白スペースに置き換えます。

これは出力です:

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

GNU awk(gawk)がある場合、組み込みの Time Functions を使用して、ファイル名と内容の一部をエポック時間。次に、選択した形式に従って変換します。

例与えられた

$ 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
4
steeldriver