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