/ / Bash-英国の形式を認識しない日付(dd / mm / yyyy)-bash、日付、形式

Bash - 日付が英国の形式を認識しない(dd / mm / yyyy) - bash、日付、形式

次の日付の形式のテキストファイルがあります 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"

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

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

回答:

回答№1の場合は3

ファイルが説明どおりの場合は、列を逆にしてください。 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

回答№2については4

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

 awk -F "/" "{print $3"/"$2"/"$1}" < file.txt

答え№3の2

少なくともMacOS 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 あなたがやりたいことをするコマンド。

したがって、を使用して答え awk, sed, perl, python 日付をマップするための正規表現が最適です。


回答№4の場合は1

国際標準の日付形式であるISO8601は、 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/(dd)/(dd)/(dddd)/$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

回答№5の場合は0

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

Win7:

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