2개의 열 이름(열 번호는 다를 수 있음)을 기준으로 데이터 스트림을 정렬하는 방법은 무엇입니까?

2개의 열 이름(열 번호는 다를 수 있음)을 기준으로 데이터 스트림을 정렬하는 방법은 무엇입니까?

다음과 같이 API에서 데이터 스트림을 얻습니다.

redID  blueID  whiteID  
1      22       2  
44     15       41  
2      15       15  
31     2       14 

내가 해야 할 일은 이것을 분류 blueID해서 whiteID다른 곳으로 보내는 것뿐입니다. 하지만 얼마나 많은 열이 있을지 미리 알 수 없습니다. 내가 확신하는 것은 항상 적어도 이 두 개의 열이 있을 것이라는 것입니다.
따라서 원하는 출력은 다음과 같습니다.

redID  blueID  whiteID  
31     2       14  
2      15      15  
44     15      41  
1      22      2 

awk열 이름을 기준으로 이 스트림을 정렬하는 방법이 있습니까 ?
내가 찾고 있는 유일한 대답은 다음과 같은 형식입니다.

inputStream | some operations | sortedInputStream

어떤 아이디어가 있나요?

답변1

다음을 수행할 수 있습니다.

 # get the header line from the file and split each header to a different line
 header=$(head -1 $file_name | tr ' ' '\n')
 # get the index/line number of the blueID
 blueID_index=$(echo "$header" | grep -n "blueID" | sed 's/:.*//')
 # same for whiteID
 whiteID_index=$(echo "$header" | grep -n "whiteID" | sed 's/:.*//')
 # now build the sort command with the indexes you just computed
 sort -k$blueID_index -k$whileID_index

답변2

의견과 기타 아이디어 소스 덕분에 마침내 이 코드를 작성하고 내 질문에 답할 수 있었습니다.

   inputStream | awk -F'\t' -v OFS="\t" '{
            if ( col1 == ""){
                for (i=1;i<=NF;i++){
                    if ($i == "BlueId"){
                        col1=i;
                    }
                    else if ($i == "WhiteId"){
                        col2=i;
                    }
                }
            print "-1" "\t" "-1" "\t" $0
            }
            else {
                print $col1 "\t" $col2 "\t" $0
            }
        }' | sort -k1,1n -k2,2n | cut -f3- | outputStream

이는 다음과 같이 작동합니다. 스트림 데이터를 가져와 필요한 열 번호를 찾고 각 행 앞에 정렬에 필요한 두 값을 인쇄합니다. 그런 다음 첫 번째와 두 번째 열을 정렬하고 삭제합니다. 감사해요!

관련 정보