2012-12-04 77 views
2

我有一個每天早上自動運行的shell腳本,它將那些日子結果附加到文本文件中。該文件應該在第一列上有今天的日期,然後用逗號分隔結果。我使用命令date +%x以所需格式(dd/mm/yy)獲取日期。然而,在一個計算機日期+%x返回mm/dd/yyyy(任何想法爲什麼是這種情況?)。然後我按日期順序對文件中的數據進行排序。使用awk/sed更改第一列中的日期格式

這裏有這樣一個文本文件中的一個片段

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。

回答

4

它看起來像你使用兩種不同的口味(版本)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 
+0

該解決方案效果很好,謝謝。 – moadeep

2

這應該工作: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位數字指定的,月/日是顛倒的。

+0

如何在我的文件中運行這個,要麼替換該文件或直接到一個新的文件 – moadeep

+0

@moadeep:你可以'cat file | sed ...> outfile'或者你應該可以執行'sed -ire ... FILE'來進行就地編輯。 – Jite

+0

小記:不需要正則表達式和最後一個'\ 4'中的最後一個'(。*)',但並不是完全不受傷害。 – Jite

-1

用awk:

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

使用/作爲分隔符,所有你需要做的是交換的第一和第二場這是使用一個臨時變量在這裏完成。

+0

如果輸入文件中的行數超過8行,則這將失敗 – Vijay

+0

想要爲每個日期交換格式。我只想將這些以mm/dd/yyyy格式換成dd/mm/yy – moadeep

1

以下命令將執行此操作。

注:無論行的許多數是如何存在於文件。這個會只是改變了過去的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 
+0

這看起來像是一個不必要的複雜解決方案。我的意思是兩個尾巴叉,你還必須指定要閱讀的行數?其次,'-r'選項在我的'tail coreutils v8.20'中不可用。 – Jite

+0

我無法使用-r選項。此外,我只想將mm/dd/yyyy格式的日期格式更改爲dd/mm/yy。此命令不會將yyyy更改爲yy,並在所有日期切換dd和mm – moadeep

1

另一種解決方案:

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