多くのファイルがあります。ファイル形式は年(4桁)月(2桁)日(2桁)
ファイル名の例:
サンプルファイル名の内容
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
ご案内ください。
これにより、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/
は.txt
をT
で置き換え、s/ -> / /
は、->
を1つの空白スペースに置き換えます。これは出力です:
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528
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