1

現在、awk を使用して、次のような .csv ファイルを再配置しようとしています。

stack,over,flow,dot,com

出力は次のようになります。

over,com,stack,flow,dot

(または、これを例として使用する他の順序)

csvファイルを再配置する時が来たら、私は以下を使用しようとしています:

first='$2'
second='$5'
third='$1'
fourth='$3'
fifth='$4'

awk -v a=$first -v b=$second -v c=$third -v d=$fourth -v e=$fifth -F '^|,|$' '{print $a,$b,$c,$d,$e}' somefile.csv

awk/print が $a、$b、$c などをフィールド番号として解釈することを意図しているため、次のようになります。

{print $2,$5,$1,$3,$4}

csvファイルのフィールドをその順序で出力しますが、残念ながら、これをまだ正しく機能させることができませんでした. 私はいくつかの異なる方法を試しましたが、これが最も有望なように思えますが、残念ながらまだ正しく機能する解決策を得ることができませんでした. そうは言っても、現時点で困惑しているので、誰かが何か提案をしたり、私の欠陥を指摘したりできるかどうか疑問に思っていました。

4

3 に答える 3

1

簡単な数字を使う:

first='2'
second='5'
third='1'
fourth='3'
fifth='4'

awk -v a=$first -v b=$second -v c=$third -v d=$fourth -v e=$fifth -F '^|,|$' \
     '{print $a, $b, $c, $d, $e}' somefile.csv
于 2012-11-29T05:41:27.533 に答える
1

短い例の別の方法:

aa='$2'
bb='$1'
cc='$3'

awk -F '^|,|$' "{print $aa,$bb,$cc}" somefile.csv
于 2012-11-29T05:45:13.833 に答える
0

特定の質問に対する回答はすでに得ていますが、個々のフィールドではなく文字列として順序を指定することだけを検討しましたか? 例えば:

order="2 5 1 3 4"

awk -v order="$order" '
   BEGIN{ FS=OFS=","; n=split(order,a," ") }
   { for (i=1;i<n;i++) printf "%s%s",$(a[i]),OFS; print $(a[i]) }
' somefile.csv

そうすれば、フィールドを追加/削除したり、順序を変更したりしたい場合は、最初の行の数字を簡単に並べ替えるだけで、ハードコードされた変数などをいじる必要がなくなります。

それほど複雑にする必要がなかったので、FS を変更したことに注意してください。また、シェル変数「order」は必要ありません。同じ名前の awk 変数を明示的に入力するだけで済みます。シェル変数から始めたので、シェル変数から始めたので、理由があるかもしれません。

于 2012-11-29T14:00:10.337 に答える