ファイルがたくさんあります。ファイル形式は年(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/ -> / /
->
1 つの空白スペースに置き換えられます。
出力は次のようになります。
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528