11

スクリプトを使用して、テーブルを含む HTML を .csv ファイルに変換しようとしていbashます。

これまでのところ、次の手順を実行しました。

  1. Unix 形式に変換 ( を使用dos2unix)
  2. すべてのスペースとタブを削除します (でsed 's/[ \t]//g')
  3. すべての空白行を削除します (with sed ':a;N;$!ba;s/\n//g') (HTML ファイルにはテーブルの各セルに空白行があるため、これは必要です...それは私のせいではありません)
  4. <td> 不要なタグとタグを削除し<tr>ます( 付きsed 's/<t.>//g'
  5. </td>「,」に置き換えます(でsed 's/<\/td/,/g')
  6. </tr>行末 ( \n) 文字に置き換える ( with sed 's/<\/tr/\n/g')

もちろん、これらすべてをパイプラインに入れています。これまでのところ、うまく機能しています。私が立ち往生している最後のステップが 1 つあります。テーブルには日付の列があり、その形式dd/mm/yyyyは であり、それらを に変換したいと考えていyyyy-mm-ddます。

sed(またはを使用して)それを行う(簡単な)方法はありawkますか?

データ サンプルsed(パイプ全体の後):

500,2,13/09/2007,30000.00,12,B-1
501,2,15/09/2007,14000.00,8,B-2

期待される結果:

500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2

これを行う必要があるのは、このデータを MySQL にインポートする必要があるためです。ファイルを Excel で開き、手動で形式を変更することもできましたが、それはスキップしたいと思います。

4

6 に答える 6

11

Awkこのタスクは非常に簡単に実行できます。

awk '
    BEGIN { FS = OFS = "," } 
    { split($3, date, /\//)
      $3 = date[3] "-" date[2] "-" date[1]
      print $0 
    }
' infile

次の結果が得られます。

500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
于 2013-08-26T21:18:30.587 に答える
11
sed -E 's,([0-9]{2})/([0-9]{2})/([0-9]{4}),\3-\2-\1,g'
于 2013-08-26T21:25:31.260 に答える
5

awkこれでうまくいきます:

echo 08/26/2013 | awk -F/ '{printf "%s-%s-%s\n",$3,$2,$1}'

bash次の-only オプションの 1 つと同様に:

IFS=/ read m d y < <(echo 08/26/2013); echo "${y}-${m}-${d}"
IFS=/ read m d y <<< "08/26/2013"; echo "${y}-${m}-${d}"

パイプラインの最後のコンポーネントにサブシェルが使用されていない を使用した場合ksh、これも同様に機能するはずです。

echo 08/26/2013 | IFS=/ read m d y; echo "${y}-${m}-${d}"

最近では、スクリプトで使用して上記の呼び出しを同様に機能させるbashこともできますが、コマンド ラインでは機能しません (以下のコメントの @mklement0 に感謝します)。shopt -s lastpipe

それを他のものと統合する方法を理解するのはあなたに任せます...

于 2013-08-26T21:19:06.520 に答える
5
sed "s:,\([0-9]\+\)/\([0-9]\+\)/\([0-9]\+\),:,\3-\2-\1,:"
于 2013-08-26T21:14:19.003 に答える
4

これまでのところ、すべての回答はOPの問題に非常に固有のものです。これは、より一般的なアプローチであり、(-dオプションの場合はGNU)dateを介して実行しますawk :

awk 'BEGIN{FS=","}
     {
       "date -d\"" $3 "\" +%Y-%m-%d" | getline mydate; 
       print $1 "," $2 "," mydate "," $4 "," $5 "," $6
     }'

もちろん、このアプローチは、入力の日付形式が で処理される場合にのみ機能しますdate。AFAICSdd/mm/yyyy残念ながら、これは の場合ではありません。(未テスト)以外のコマンドを試すこともできます。date

編集: mklement0 のコメントを実装しました。

mawkEdit2 : 実際には、これは Debian のデフォルトのawk実装であるでは機能しません。明らかな解決策は、可能な場合にインストールgawkすることです。

于 2016-03-16T12:10:14.293 に答える
2

yyyy-mm-dd (yyyy-dd-mm ではない) を求めると仮定して awk を修正

エコー 2013 年 8 月 26 日 | awk -F/ '{printf "%s-%s-%s\n",$3,$1,$2}'

于 2014-04-02T13:39:54.677 に答える