0

このシェル スクリプトをまとめて、次の 2 つのことを行います。

  1. データ ファイルの区切り文字を変更します (この場合は「::」を「,」に変更します)。
  2. 必要な列を選択して、新しいファイルに追加します

それは機能しますが、これを行うためのより良い方法が必要です。特に、各行を配列に分解するための代替方法を見つけたいと思っています。コマンド ライン引数を使用する方法は適切ではないようです。どんなコメントでも大歓迎です。

    # Takes :: separated file as 1st parameters
    SOURCE=$1

    # create csv target file
    TARGET=${SOURCE/dat/csv}
    touch $TARGET

    echo #userId,itemId > $TARGET

    IFS=","
    while read LINE
    do
        # Replaces all matches of :: with a ,
        CSV_LINE=${LINE//::/,}
        set -- $CSV_LINE
        echo "$1,$2" >> $TARGET
    done < $SOURCE
4

4 に答える 4

2

の代わりにset、配列を使用できます。

arr=($CSV_LINE)
echo "${arr[0]},${arr[1]}"
于 2012-06-15T11:26:32.943 に答える
2

以下は、 から列 1 と 2 を出力しinfile.datます。必要な番号付き列のコンマ区切りリストに置き換えます。

awk 'BEGIN { IFS='::'; OFS=","; } { print $1, $2 }' infile.dat > infile.csv
于 2012-06-15T13:57:55.910 に答える
1

awk確かにここでの仕事に適したツールであり、シンプルなワンライナーです。

$ cat test.in
a::b::c
d::e::f
g::h::i
$ awk -F:: -v OFS=, '{$1=$1;print;print $2,$3 >> "altfile"}' test.in
a,b,c
d,e,f
g,h,i
$ cat altfile
b,c
e,f
h,i
$
于 2012-06-15T12:22:34.833 に答える
1

Perl にはおそらくそれを行うための 1 つのライナーがあります。

Awkもおそらく簡単に実行できます。

私の最初の反応は、awk と sed の組み合わせです。

  • 区切り文字を変換する Sed
  • 特定の列を処理するための awk
cat inputfile | sed -e 's/::/,/g' | awk -F, '{print $1, $2}'
# Or to avoid a UUOC award (and prolong the life of your keyboard by 3 characters
sed -e 's/::/,/g' inputfile | awk -F, '{print $1, $2}'
于 2012-06-15T03:30:32.010 に答える