CSV 파일에서 모든 열을 열 이름별로 정렬하려고 합니다. 내가 가진 것은 이것입니다:
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
내가 필요한 출력은
adress ,name ,mobile-number
USA ,Ane ,12121212
England,Joane ,234234
문제는 열이 3개 이상 있고 정렬 순서를 모르지만 오름차순으로 다시 정렬해야 한다는 것입니다.
답변1
Miller( mlr
)를 사용하여 헤더를 포함하여 각 필드의 과도한 공백을 정리한 다음 필드 순서를 변경합니다.
$ mlr --csv clean-whitespace then reorder -f adress,name,mobile-number file
adress,name,mobile-number
USA,Ane,12121212
England,Joane,234234
(를 사용하면 필드가 필드의 시작 부분으로 reorder -f adress
만 이동되며 , 이 경우 동일한 효과가 있습니다.)adress
또는 헤더 정렬 방식에 따라 필드를 오름차순으로 정렬하려는 경우:
$ mlr --csv clean-whitespace then sort-within-records file
adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane
답변2
우리가 할 수 있는 일은 다음을 사용하여 열을 행으로 바꾸는 것입니다.rs
BSD Unix에서 파생된 유틸리티로 행만 sort
(따라서 원본 데이터의 열을 효과적으로 정렬) 한 다음 다시 바꿉니다.
먼저, 가나다순으로 주소, 휴대폰번호, 이름 순이니 참고하시기 바랍니다. M이 N 앞에!
단계별:
$ cat data
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
$ rs -s, -C, -T < data
name ,Ane ,Joane ,
adress ,USA ,England ,
mobile-number,12121212,234234,
$ rs -s, -C, -T < data | sort
adress ,USA ,England ,
mobile-number,12121212,234234,
name ,Ane ,Joane ,
$ rs -s, -C, -T < data | sort | rs -s, -C, -T
adress ,mobile-number,name ,
USA ,12121212,Ane ,
England ,234234,Joane ,
$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T
adress mobile-number name
USA 12121212 Ane
England 234234 Joane
마침내:
$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T | sed -e 's/ \([^ ]\)/,\1/g'
adress ,mobile-number ,name
USA ,12121212 ,Ane
England ,234234 ,Joane
저는 Ubuntu GNU/Linux에서 이 작업을 수행했으며 먼저 sudo apt-get install rs
.
답변3
사용행복하다(이전 Perl_6)
~$ raku -MText::CSV -e 'my @dta = csv(in => $*IN, sep => ",", strict => True)>>.trim; \
my $index = @dta.[0].pairs.sort(*.value).map: *.key; \
@dta.=map( *.[$index.cache]); csv(in => @dta, out => $*OUT);' file
Raku는 고급 유니코드를 지원하는 Perl 제품군의 프로그래밍 언어입니다. 위의 언어는 Raku 모듈의 명령줄에서 사용됩니다 Text::CSV
.
입력 예:
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
예제 출력:
adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane
즉, 메소드/함수를 사용하여 데이터를 읽고 csv(...)
, 항목 주위의 공백을 제거하고 trim
, @dta
배열에 저장하는 데 사용합니다. 항목을 번호 매기기로 변환하고 ing by로 정렬한 다음 정렬된 숫자를 가져오는 방식으로 의 첫 번째 행에서 An이 $index
생성 됩니다. 그런 다음 재정렬된 열로 덮어씁니다. 마지막으로 파일이 표준 출력에 배치됩니다.[0]
@dta
pairs
sort
value
key
@dta
.=
$index
csv
out
$*OUT
참고: 쌍을 제거하기 위한 호출은 >>.trim
다음에 따라 항목에 후행 공백이 포함된 큰따옴표로 묶인 열 값을 반환합니다.RFC 4180. 과 같이 인덱스 코드를 추가하여 .reverse
열 정렬 순서를 반대로 바꿉니다 [$index.cache.reverse]
.
>>.trim
다음이 없는 출력 예 .reverse
:
"name ",mobile-number,"adress "
"Ane ",12121212,"USA "
"Joane ",234234,"England "
https://github.com/Tux/CSV/blob/master/doc/Text-CSV.md
https://docs.raku.org
https://raku.org