이 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
.
네 번째 필드가 끝으로 이동되도록 헤더 없는 CSV 파일에서 마지막 세 필드의 순서를 변경하려면 다음을 수행하세요.
$ 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
즉, 입력 및 출력 필드 구분 기호를 설정하고 원하는 순서대로 필드를 인쇄하면 됩니다.