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

Bashはawkまたは他のLinuxツール(csvcut)を使用してcsvファイルの日付を変換します。
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インポートジョブの日付を標準化しています。ありがとうございます。

ベストアンサー1

system()この機能を間違った方法で使用しています。または、コマンドの出力を返さずに終了状態(出力が端末に送信される)のみを返すので、ここではこれは使用されません。

dateGNUを想定して、実行日の形式を再指定するスクリプトdateは次のとおりです。awk

BEGIN { OFS = FS = "," }

$1 {
    cmd = sprintf("date -d '%s' '+%%d-%%m-%%Y' 2>/dev/null", $1);
    cmd | getline $1;
    print;
    close(cmd);
}

実行してください:

$ awk -f script.awk data.csv
Bogført,Tekst,Beløb,Saldo
03-02-2017, random text,-425,-611524.54

スクリプトは空の入力行を削除します。cmd実際の日付変換を実行するためにGNUを使用するコマンド文字列を生成しますdate。エラーはdate削除され、$1変更されません。

これを行うにはcvssql(からcsvkit):

$ sed '1,2d' data.csv | csvsql -H --query 'SELECT strftime("%d-%m-%Y", a), b, c, d FROM stdin' | sed '1d' >new_data.csv

データにnew_data.csvヘッダー行はありません。再追加するには:

$ cat <( head -n 1 data.csv ) new_data.csv >even_newer_data.csv

おすすめ記事