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()
この機能を間違った方法で使用しています。または、コマンドの出力を返さずに終了状態(出力が端末に送信される)のみを返すので、ここではこれは使用されません。
date
GNUを想定して、実行日の形式を再指定するスクリプト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