この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
つまり、入力フィールドと出力フィールドの区切り文字を設定し、必要な順序でフィールドを印刷するだけです。