我有很多文件。文件格式為年(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/ -> / /
->
用一個空格替換。
這是輸出:
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528