1

次の日付の形式のテキスト ファイルがありますdd/mm/yyyy

14/09/1992
15/04/1983
15/09/1961
02/06/1979
14/12/1971
08/02/2001
19/06/1999
14/09/1969
31/08/2002
30/07/1980
25/04/1973
03/01/1992

YYYY/mm/ddこれをスクリプトの形式に変換したい。そのためにdateコマンドを使用することを計画していました:

date -f tempDate +%Y/%m/%d

しかし問題は、英語スタイルの日付を認識せず、次のエラーを表示することmm/dd/yyyyです。

date: invalid date `14/09/1992'

これを行う別の方法はありますか?または、日付形式の順序を変更する方法はありますか?

また、システム管理者ではないサーバーでこのスクリプトを動作させる必要があります。

4

5 に答える 5

5

ファイルが説明どおりの場合、次のように列を逆にしないのはなぜですかawk

$ awk 'BEGIN{FS=OFS="/"}{print $3,$2,$1}' file
1992/09/14
1983/04/15
1961/09/15
1979/06/02
1971/12/14
2001/02/08
1999/06/19
1969/09/14
2002/08/31
1980/07/30
1973/04/25
1992/01/03

編集:

awk複数のフィールドセパレーターを使用するのと同じくらい簡単です:

$ awk -F[/,] '{print $1","$2","$5"/"$4"/"$3}' <<< "name,number,14/09/1992"
name,number,1992/09/14
于 2013-01-14T16:54:55.627 に答える
4

簡単な awk スクリプトを使用して、年/月/日の順序に変更できます。

 awk -F '/' '{print $3"/"$2"/"$1}' < file.txt
于 2013-01-14T16:54:14.593 に答える
2

少なくとも Mac OS X では、-fこれまでのオプションは次のように文書化されています。

-f デフォルトの形式を使用するのではなく、指定された new_date を解析するための形式文字列として input_fmt を使用します [[[mm]dd]HH]MM[[cc]yy][.ss]。解析は を使用して行われstrptime(3)ます。

したがって、次を使用する必要があります。

date -f '%d/%m/%Y' +'%Y-%m-%d' ...

ただし、残りの問題は複数の値を変換することです。そのためには を複数回呼び出す必要があるdateため、次のようなことを試してください。

# Bogus code
while read date                                   # Bogus code
do date -f '%d/%m/%Y' $date +'%Y-%m-%d'           # Bogus code
done < tempDate                                   # Bogus code
# Bogus code

ただし、これはシステム クロックの設定を試みます (実際にその場にいない限り、うまくいきません。また、実験root中はそうすべきではありません)。そのため、コマンドで目的の操作を行うroot明確な方法はありません。date

したがって、 、awksedperlおよびpython正規表現を使用して日付をマッピングする回答が最適です。

于 2013-01-14T17:04:42.693 に答える
1

国際標準の日付形式である ISO 8601 は でありYYYY-MM-DD、 ではありませんYYYY/MM/DD。よほどの理由がない限り、使用することをお勧めします。

米国と英国の日付形式は、各月の 13 日より前の日付に対してあいまいであるため、date認識されないことは驚くべきことではありません。特定の文字列が英国形式であることを伝える方法はあるかもしれませんが、それが何であるかはわかりません。

sed、または正規表現置換を行うその他のツールを使用して、形式を変更できます。

$ echo 14/09/1992 | sed 's/\([0-9][0-9]\)\/\([0-9][0-9]\)\/\([0-9][0-9][0-9][0-9]\)/\3-\2-\1/'
1992-09-14

Perl はこれをもう少し冗長に行うことができます:

$ echo 14/09/1992 | perl -pe 's/(\d\d)\/(\d\d)\/(\d\d\d\d)/$3-$2-$1/'
1992-09-14

また:

$ echo 14/09/1992 | perl -pe 's/(\d{2})\/(\d{2})\/(\d{4})/$3-$2-$1/'
1992-09-14
于 2013-01-14T16:50:02.550 に答える
0

Windows を使用している場合は、地域設定を変更して、コンピューター全体、特に .csv ファイルの日付形式を変更することもできます。

Win7:

1./ [スタート] ボタンに移動します。 2./ [コントロール パネル] を選択します。 3./ [時計、言語、および地域] を選択します。4./日付、時刻、数値の形式を変更します。

于 2014-05-24T12:52:12.087 に答える