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.

네 번째 필드가 끝으로 이동되도록 헤더 없는 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

즉, 입력 및 출력 필드 구분 기호를 설정하고 원하는 순서대로 필드를 인쇄하면 됩니다.

관련 정보