1

以下は、csv ファイルを取り込み、希望どおりにフォーマットされた行を吐き出すための bash シェル スクリプトです (他にも変更がいくつかありますが、以下に示すものに影響を与える配列のみを保持しています)。

FILENAME=$1
cat $FILENAME | while read LINE
do
    OIFS=$IFS;
    IFS=","
    columns=( $LINE )
    date=${columns[4]//\"/}
    columns[13]=${columns[13]//\"/}
    columns[4]=$(date -d $date +%s)
    newline=${columns[*]}
    echo $newline
    IFS=$OIFS;
done

CentOS 6.3 用の GNU bash v 4.1.2(1) リリースを使用しています。私は次のような引用符を入れてみました

newline="${columns[*]}"

まだ運がありません。

以下はサンプルデータ行です

112110120001299169,112110119001295978,11,"121.119.163.146.1322221980963094","2012/11/01"

配列をコンマ区切りの文字列に出力する必要があるようです。代わりに、文字列はスペースで区切られています。その理由を知っている人はいますか?

スクリプトで $IFS をエコーアウトすると空の文字列になるという事実と関係があると思われますが、「${IFS}」をエコーアウトすると、期待するカンマになります。

編集:解決策

解決策を見つけました。$newline をエコーアウトするときは、引用符で囲む必要があります。

echo "$newline"

それ以外の場合は、デフォルトの空白が使用されます。引用符を付けて強制的にIFSにサブインするだけのbashと関係があると思います。

4

2 に答える 2

2

理由ははっきりしていませんが、二重引用符で囲まれている場合、bash は ${array[*]} を展開するときに IFS の最初の文字のみを区切り文字として使用しているようです。

$ columns=(a b "c d e" f)
$ IFS=,
$ echo ${columns[*]}
a b c d e f
$ echo "${columns[*]}"
a,b,c d e,f
$ newline=${columns[*]}; echo "$newline"
a b c d e f
$ newline="${columns[*]}"; echo "$newline"
a,b,c d e,f

幸いなことに、解決策は簡単です。二重引用符 ( newline="${columns[*]}")を使用します。

(ところで、v4 が手元にないので、私のテストはすべて bash v3 と v2 で行われました。そのため、あなたにとっては異なるかもしれません。) (更新: bash v4.2.10 でテストされ、同じ結果です。)

于 2012-12-22T03:03:50.383 に答える
1

編集@GordonDavidsonのおかげで、bashでIFSがどのように機能するかについての誤ったコメントを削除しました。

awkFS=","; OFS="|"この変換を実行する名前の非常に優れた変数のペアがあります。awk -F, '{"date -d "$date" +%s" | getline columns[4]}'外部プログラムを呼び出して変数を入力するには、構築または同様の操作を行う必要があります。シェルほど直感的ではありませんc[4]=$(date ...)awk、質問で概説したようなデータ操作を学ぶための非常に優れたツールです。

何かのようなもの

#!/bin/awk -f
{
  # columns=( $LINE )
  split($0, columns)

  # date=${columns[4]//\"/}
  myDcolucolumns[4] ; gsub(/\"/, "", myDate)
  # gcolumns[13]=${columns[13]//\"/}
  gsub(/\"/,""columns[13]}
  # columns[4]=$(date -d $date +%s)
  "date -d '"$date"' +%s" | getline columns[4]

  #Don_t_need_this newline=${columns[*]}

  #echo $newline
} print  $0

のように使用

 cat myFile | myAwkScript 

同じ結果を達成する必要があります。

申し訳ありませんが、現在これをテストする時間、またはサンプルデータがありません。表示されたエラーメッセージを自由に返信してください。サポートできるかどうかを確認します。

また、1行のサンプルデータと処理する日付値を使用して投稿を更新することを検討することもできます。IHTH

于 2012-12-22T02:42:09.737 に答える