如何按 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

它的工作原理如下:它获取流数据,找到所需的列号并在每行前面打印排序所需的两个值。然后对第一列和第二列进行排序并删除它们。谢谢!

相关内容