web-dev-qa-db-ja.com

awkまたは他のLinuxツール(csvcut)を使用してcsvファイルの日付をBash変換する

awk -F"," '{OFS=","; $1=system("date -d "$1" +%d-%m-%Y") ; print $0}' data.csv | head 

私はcsvファイルの最初の列を取り、日付形式を%dd-%mm-%yyyyに標準化しようとしています。

上記のコードを試してみると、日付:書き込みエラー:パイプが壊れています。

しかし、以下のコードを試してみると:

dd=$(csvcut -c  1 -e ISO-8859-1 -d ","  data.csv | head -2 | sed -n 2p)
echo $dd
echo $(date -d $dd "+%d-%m-%Y")

出力を取得します:

2017-02-03

2017年3月2日

私は何が間違っているのですか。ヒントはありますか?ありがとう。

私のシステム:Ubuntu 16.04.1 LTS

編集2:サンプルファイルは次のとおりです: http://grn.dk/sites/default/files/attachments/data.csv

編集:

確実なCSVデータファイル(入力):data.csv(多数の行を含む)

Bogført,Tekst,Beløb,Saldo  

2017-02-03, random text,-425,-611524.54  

出力:

Bogført,Tekst,Beløb,Saldo    
03-02-2017, random text,-425,-611524.54 

ただし、日付の形式は他の形式でもかまいません。現在、csvインポートジョブの日付の標準化を検討しています。ありがとう。

3
Greg Nowak
bash-4.1$ cat a.txt
2017-02-03, random text,-425,-611524.54
2017-02-08, random text,-425,-611524.54
2017-02-07, random text,-425,-611524.54


bash-4.1$ awk -F, '{a="date -d "$1" +%Y%m%d"; while (a |getline line){$1=line;}print $0}' OFS=, a.txt
20170203, random text,-425,-611524.54
20170208, random text,-425,-611524.54
20170207, random text,-425,-611524.54

bash-4.1$ awk -F, '{a="date -d "$1" +%Y%m"; while (a |getline line){$1=line;}print $0}' OFS=, a.txt
201702, random text,-425,-611524.54
201702, random text,-425,-611524.54
201702, random text,-425,-611524.54

awk -F, 'NR==1{print;next}{a="date -d "$1" +%Y%m"; while (a |getline line){$1=line;}print $0}' OFS=, a.txt
1
Kamaraj

Ubuntuを使用しているため、おそらくGNU awkがあり、便利な時刻と日付の関数を提供します。

echo "2017-03-02" | \
awk '{ gsub(/-/, " ", $1); t = mktime($1 " 0 0 0"); print strftime("%d-%m-%Y", t);}'
1
Michael Vehrs