특정 행의 열을 기준으로 모든 행을 가로로 정렬합니다.

특정 행의 열을 기준으로 모든 행을 가로로 정렬합니다.

세로가 아닌 가로로 정렬해야 하는데, 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

awkGNU를 사용하면 내부 설정을 통해 배열이 탐색되는 순서를 지정할 수 있습니다 . 이 경우 값의 오름차순으로 배열을 강제로 순회하도록 설정합니다.sorted_inPROCINFO@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 -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

  1. 사용암소 비슷한 일종의 영양datamash,바꾸어 놓다, 정렬 및바꾸어 놓다다시:

    datamash -t '/' transpose < file | datamash -t '/' -s -g1 transpose
    

    산출:

    apple/banana/mango/orange
    onion/potato/garlic/tomato
    carpet/chair/window/table
    
  2. 다양한 종류소프트웨어 도구:

    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
    

    작동 방식: joinoptions 에 전달된 인수를 통해 열의 순서를 변경할 수 있습니다 -o. 따라서 (변수와 배열을 사용하지 않고) 다음 매개변수를 생성하는 것이 요령입니다.

    1. head첫 번째 행을 가져오고,
    2. tr여러 줄로 변환하고,
    3. 어떤 nl숫자,
    4. sort두 번째 열(예:사과, 등. ),
    5. cut열 1의 재정렬된 숫자 목록 ,
    6. sedjoin숫자를 원하는 형식 으로 변환하세요 .

관련 정보