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