세로가 아닌 가로로 정렬해야 하는데, sort
세로 작업용으로 설계된 것 같습니다. 예를 들어 다음과 같은 세 개의 행이 있습니다.
banana/orange/apple/mango
potato/tomato/onion/garlic
chair/table/carpet/window
모든 행은 동일한 수의 열을 가지며 로 구분됩니다 /
. 첫 번째 행의 열을 알파벳순으로 다시 정렬하고 싶습니다. 그래서 그것은 다음과 같습니다:
apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table
이는 다음과 같이 더 잘 시각화될 수 있습니다.
즉, 스프레드시트에서 열을 기준으로 정렬하는 것과 같습니다.
답변1
awk
GNU를 사용하면 내부 설정을 통해 배열이 탐색되는 순서를 지정할 수 있습니다 . 이 경우 값의 오름차순으로 배열을 강제로 순회하도록 설정합니다.sorted_in
PROCINFO
@val_str_asc
다음으로 첫 번째 행을 배열로 분할 a
하고 마지막으로 각 행에 대해 배열을 반복하고 검색 시 키에 해당하는 필드를 인쇄합니다.
awk -F'/' 'BEGIN{PROCINFO["sorted_in"]="@val_str_asc"};
FNR == 1{n = split($0, a)};
{x=0; for (k in a) printf "%s%s", $k, ++x == n? "\n": FS}' file
apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table
아니면python
from __future__ import print_function
with open('file') as f:
keys = next(f).rstrip('\n').split('/')
print(*sorted(keys), sep='/')
for line in f:
g = (m for l, m in sorted(zip(keys, line.rstrip('\n').split('/'))))
print(*g, sep='/')
apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table
답변2
제가 생각하는 기본적인 접근 방식은
예를 들어 다음과 같이 첫 번째 행을 기준으로 정렬된 색인 목록을 만듭니다.Perl에서 정렬된 목록의 인덱스를 반환하는 방법은 무엇입니까?
목록을 사용하여 행 분할
그래서
perl -F'/' -alne '
our @inds = sort { $F[$a] cmp $F[$b] } 0..$#F if $. == 1;
print join "/", @F[@inds]
' file
답변3
BSD에rs
유틸리티:
$ rs -T -c'/' <data.in | sort | rs -T -C'/' >data.out
-T
바꾸어 놓다-c'/'
입력 열 구분 기호 설정-C'/'
출력 열 구분 기호 설정
그것을 보세요:
$ cat data.in
banana/orange/apple/mango
potato/tomato/onion/garlic
chair/table/carpet/window
$ cat data.out
apple/banana/mango/orange/
onion/potato/garlic/tomato/
carpet/chair/window/table/
/
끝에 있는 추가 비트를 제거합니다 .
$ sed 's#/$##' data.out
apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table
답변4
사용암소 비슷한 일종의 영양
datamash
,바꾸어 놓다, 정렬 및바꾸어 놓다다시:datamash -t '/' transpose < file | datamash -t '/' -s -g1 transpose
산출:
apple/banana/mango/orange onion/potato/garlic/tomato carpet/chair/window/table
다양한 종류소프트웨어 도구:
join -a 1 -t / -o $( head -n 1 file | \ tr / '\n' | \ nl -n ln | \ sort -k2 | \ cut -f1 | \ sed -n 's/^/1./;H;1h;${x;s/\n/,/g;s/ //gp}' ) \ file /dev/null
작동 방식:
join
options 에 전달된 인수를 통해 열의 순서를 변경할 수 있습니다-o
. 따라서 (변수와 배열을 사용하지 않고) 다음 매개변수를 생성하는 것이 요령입니다.head
첫 번째 행을 가져오고,tr
여러 줄로 변환하고,- 어떤
nl
숫자, sort
두 번째 열(예:사과, 등. ),cut
열 1의 재정렬된 숫자 목록 ,sed
join
숫자를 원하는 형식 으로 변환하세요 .