awkを使用してcsvファイルの列の順序を変更するには?

awkを使用してcsvファイルの列の順序を変更するには?

このCSVの順序を変更したいと思います。

92000,X,19.30,2022-03-01 05:31:58.990562+00,19.29,
00293,X,40.64,2021-09-30 13:10:32.084467+00,40.49,
00293,X,80.95,2021-09-30 13:10:32.084467+00,80.49,
00293,X,41.60,2021-09-30 13:10:32.739939+00,41.49,

このように。

92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

多くのコマンドを試しましたが、awk成功しませんでした。誰かがこれを行う方法を教えてもらえますか?

フィールドの元の順序が1、2、3、4、5、6であった場合、新しい順序は1、2、3、5、6、4でなければなりません(最後の5、6、4に注意してください)。

答え1

これでマークしたから、次のCSVをサポートするツールを使用します。ミラーmlr)、代わりにawk

4番目のフィールドが最後に移動するようにヘッダーなしのCSVファイル内の最後の3つのフィールドの順序を変更するには、次の手順を実行します。

$ mlr --csv -N reorder -e -f 4 file
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

これを簡単に実行できる別のCSV認識ツールは、csvcut以下に提供されています。csvkit:

$ csvcut -c 1,2,3,5,6,4 file
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

答え2

私が正しく理解したら、次のように熱を変えたいと思います。

  • 列4は列6になります。
  • 列5は列4になります。
  • 列6(空)は列5になります。

これはとても簡単です awk

awk 'BEGIN{FS=OFS=","} {tmp4=$4;tmp5=$5;tmp6=$6;$4=tmp5;$5=tmp6;$6=tmp4}1' input.csv 
  • これにより、入力フィールドと出力フィールドの区切り文字がに設定されます,
  • これで保存されます。現在の4、5、6列の内容を一時変数、tmp4およびにそれぞれ配置し、tmp5上のリストに従って、tmp6および列を再割り当てします。$4$5$6
  • 1ルールブロックの外側にある「迷子になった」コンテンツのように見えることは、awkこれまでに行われたすべての修正を含む現在の行を印刷するように指示します。

デフォルトでは、awkファイルの内部変更は行われず、コンソールにのみ印刷されるため、出力ファイルにリダイレクトして名前を変更する必要があります。拡張機能をawk理解できる最新バージョンのGNUがある場合は、ファイルを直接変更するように指示すること-i inplaceもできます。awk

awk -i inplace ' .... ' input.csv

答え3

使用xsv:

$ xsv select 1-3,5,6,4 file
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

xsvこのコマンドは、必要に応じて列の順序を再指定するコマンドを使用しますselect

答え4

$ awk -F, -v OFS=, '{print $1,$2,$3,$5,$6,$4}' file.csv 
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

つまり、入力フィールドと出力フィールドの区切り文字を設定し、必要な順序でフィールドを印刷するだけです。

関連情報