簡體   English   中英

使用awk / sed更改第一列中的日期格式

[英]Change date format in first column using awk/sed

我有一個shell腳本,每天早上自動運行,將該天結果附加到文本文件。 該文件應該在第一列上有今天的日期,后面跟逗號分隔的結果。 我使用命令日期+%x來獲取所需格式的日期(年/月/日)。 但是在一台計算機日期+%x返回mm / dd / yyyy(任何想法為什么會這樣?)。 然后我按日期順序對文件中的數據進行排序。

這是一個這樣的文本文件的片段

29/11/12,9654.80,194.32,2.01,7.19,-7.89,7.65,7.57,3.98,9625.27,160.10,1.66,4.90,-4.79,6.83,4.84,3.54                
03/12/12,5184.22,104.63,2.02,6.88,-6.49,7.87,6.67,4.10,5169.52,93.81,1.81,5.29,-5.45,7.87,5.37,4.10                
04/12/12,5183.65,103.18,1.99,6.49,-6.80,8.40,6.66,4.38,5166.04,95.44,1.85,6.04,-6.49,8.40,6.28,4.38                
11/07/2012,5183.65,102.15,1.97,6.78,-6.36,8.92,6.56,4.67,5169.48,96.67,1.87,5.56,-6.10,8.92,5.85,4.67                
07/11/2012,5179.39,115.57,2.23,7.64,-6.61,8.83,7.09,4.62,5150.17,103.52,2.01,7.01,-6.08,8.16,6.51,4.26                
11/26/2012,5182.66,103.30,1.99,7.07,-5.76,7.38,6.37,3.83,5162.81,95.47,1.85,6.34,-5.40,6.65,5.84,3.44                
11/30/2012,5180.82,95.19,1.84,6.51,-5.40,7.91,5.92,4.12,5163.98,91.82,1.78,5.58,-5.07,7.05,5.31,3.65     

是否可以使用awk或sed將后四行的日期格式更改為正確的日期格式? 我只希望將mm / dd / yyyy形式的日期格式更改為dd / mm / yy。

看起來你正在使用兩種不同風格(版本)的date 要檢查你有哪些版本,我認為GNU date接受--version標志,而其他版本,如BSD/OSX將不接受此標志。

由於您可能使用完全不同的系統,因此最安全地避免使用date並使用perl打印當前日期可能是最安全的:

perl -MPOSIX -e 'print POSIX::strftime("%d/%m/%y", localtime) . "\n"'

如果你確定你在兩台機器上都有GNU awk ,你可以像這樣使用它:

awk 'BEGIN { print strftime("%d/%m/%y") }'

要修復你已經獲得的文件,這是我使用GNU awk的看法:

awk '{ print gensub(/^(..\/)(..\/)..(..,)/, "\\2\\1\\3", "g"); next }1' file

或使用sed

sed 's/^\(..\/\)\(..\/\)..\(..,\)/\2\1\3/' file

結果:

29/11/12,9654.80,194.32,2.01,7.19,-7.89,7.65,7.57,3.98,9625.27,160.10,1.66,4.90,-4.79,6.83,4.84,3.54                
03/12/12,5184.22,104.63,2.02,6.88,-6.49,7.87,6.67,4.10,5169.52,93.81,1.81,5.29,-5.45,7.87,5.37,4.10                
04/12/12,5183.65,103.18,1.99,6.49,-6.80,8.40,6.66,4.38,5166.04,95.44,1.85,6.04,-6.49,8.40,6.28,4.38                
07/11/12,5183.65,102.15,1.97,6.78,-6.36,8.92,6.56,4.67,5169.48,96.67,1.87,5.56,-6.10,8.92,5.85,4.67                
11/07/12,5179.39,115.57,2.23,7.64,-6.61,8.83,7.09,4.62,5150.17,103.52,2.01,7.01,-6.08,8.16,6.51,4.26                
26/11/12,5182.66,103.30,1.99,7.07,-5.76,7.38,6.37,3.83,5162.81,95.47,1.85,6.34,-5.40,6.65,5.84,3.44                
30/11/12,5180.82,95.19,1.84,6.51,-5.40,7.91,5.92,4.12,5163.98,91.82,1.78,5.58,-5.07,7.05,5.31,3.65

這應該工作: sed -re 's/^([0-9][0-9])\\/([0-9][0-9])\\/[0-9][0-9]([0-9][0-9])(.*)$/\\2\\/\\1\\/\\3\\4/'

它可以做得更小,但我做到了它更明顯它做了什么(4組,只是切換月/日和刪除一年中的前兩個字符)。

提示:如果你不想cat到變更的文件你可以in placesed -i 但是如果你把一個錯誤的表達式放在最后你可能會破壞你的源文件,請小心。

注意 :這假設如果年份指定為4位數,則月/日相反。

以下命令將執行此操作。

注意:無論文件中有多少行。這只會改變最后4行。

tail -r your_file| awk -F, 'NR<5{split($1,a,"/");$1=a[2]"/"a[1]"/"a[3];print}1'|tail -r

好吧,我可以找到一些方法,而不使用管道和使用單個awk語句,這個解決方案確實需要一個tail命令:

awk -F, 'BEGIN{cmd="wc -l your_file";while (cmd|getline tmp);split(tmp,x)}x[1]-NR<=4{split($1,a,"/");$1=a[2]"/"a[1]"/"a[3];print}1' your_file

另一種方案:

awk -F/ 'NR<4;NR>3{a=$1;$1=$2;$2=a; print $1"/"$2"/" substr($3,3,2) substr($3,5)}' file

使用awk:

$ awk -F/ 'NR>3{x=$1;$1=$2;$2=x}1' OFS="/" file

通過使用/作為分隔符,您需要做的就是使用臨時變量交換第1和第2個字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM