如何透過更改格式到同一文件來插入文件名?

如何透過更改格式到同一文件來插入文件名?

我有很多文件。文件格式為年(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/替換.txtT
  • s/ -> / /->用一個空格替換。

這是輸出:

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

相關內容