[英]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 place
與sed -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.