3

毎朝自動的に実行されるシェルスクリプトがあり、その日の結果をテキストファイルに追加します。ファイルの最初の列に今日の日付があり、その後にコンマで区切られた結果が続く必要があります。コマンドdate+%xを使用して、必要な形式(dd / mm / yy)で日を取得します。ただし、あるコンピューターの日付で+%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を使用して、後の4行の日付形式を正しい日付形式に変更することはできますか?mm / dd/yyyyの形式の日付形式をdd/mm/yyに変更したいだけです。

4

5 に答える 5

5

の2つの異なるフレーバー(バージョン)を使用しているようですdate。あなたが持っているバージョンをチェックするために、私はフラグGNU dateを受け入れると思いますが、他のバージョンのような他のバージョンはこのフラグを受け入れません。--versionBSD/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
于 2012-12-04T13:50:34.260 に答える
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つのグループ、月/日を切り替えて、年の最初の2文字を削除するだけです)。

catヒント:ファイルを作成したくない場合は、を使用して変更in placeを加えることができますsed -i。ただし、誤った式を入力すると、ソースファイルが破損する可能性があるので注意してください。

:これは、年が4桁で指定されている場合、月/日が逆になることを前提としています。

于 2012-12-04T12:31:49.300 に答える
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
于 2012-12-04T12:53:17.757 に答える
1

別の解決策:

awk -F/ 'NR<4;NR>3{a=$1;$1=$2;$2=a; print $1"/"$2"/" substr($3,3,2) substr($3,5)}' file
于 2012-12-05T16:50:29.190 に答える
-1

awkの使用:

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

/を区切り文字として使用することにより、一時変数を使用してここで行われる1番目と2番目のフィールドを交換するだけで済みます。

于 2012-12-04T12:34:46.800 に答える