按前两列中的最大值排序

按前两列中的最大值排序

我有一个文件,其中包含:

1 1 1 1 text1
7 9 4 2 text2
2 2 0.5 0.7 text3
5 4 1 2 text4

我想根据前两列的最大值对其进行排序(输出到终端)。

预期输出:

1 1 1 1 text1
2 1 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

如何才能实现这一目标?谢谢!

答案1

您的输入文件是:

1 1 1 1 text1
7 9 4 2 text2
2 2 0.5 0.7 text3
5 4 1 2 text4

有了这个输入,一个简单的sort工作就可以了:

$ sort << EOF
> 1 1 1 1 text1
> 7 9 4 2 text2
> 2 2 0.5 0.7 text3
> 5 4 1 2 text4
> EOF
1 1 1 1 text1
2 2 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

如果我们将输入修改为...

$ cat test.txt
1 3 1 1 text1
7 9 4 2 text2
2 1 0.5 0.7 text3
5 4 1 2 text4

然后输入就变得具有挑战性。简单的sort已经不行了,我们可以测试其他方法:

$ sort -k1,1n -k2,2n < test.txt
1 3 1 1 text1
2 1 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

不是我们所期望的 - 输出的前两行是相反的 - 第 1 行中最高的 1/2 列值是“3”,第 2 行中最高的 1/2 列值是“2”。

以下似乎可以工作,至少对于修改后的输入文件来说是这样,但它并不漂亮(我的 awk-fu 很弱):

$ awk '{ sorton=$1; if ($2>$1) { sorton=$2 }; print $1, $2, $3, $4, $5, sorton }' < test.txt | sort -k 6 | cut -d " " -f 1-5
2 1 0.5 0.7 text3
1 3 1 1 text1
5 4 1 2 text4
7 9 4 2 text2

@Nominal-Animal 和 @JJoao 建议进行改进,结果是:

$ awk '{ k= $1>$2 ? $1: $2 ; print k, $0 }' test.txt | sort -g | cut -d ' ' -f 2-
2 1 0.5 0.7 text3
1 3 1 1 text1
5 4 1 2 text4
7 9 4 2 text2

(请随意编辑这篇文章以完善awk解决方案。)

答案2

对于前两列中的数字排序

sort -n -t " " -k1,1 -k2,2 /path/to/file

答案3

你可以使用 GNU 来做到这一点sort

sort -k1,1n -k2,2n yourfile
  • -k用于指定列

答案4

如果你有 GNU awk (gawk) 作为你的 awk,你可以使用它的asort()函数来完成 awk 本身内部的所有事情:

{
  max = $1 > $2 ? $1 : $2;
  if (max in lines)
    lines[max] = lines[max] ORS $0
  else
    lines[max] = $0
}

END {
  asort(lines, lines, "@ind_num_asc")
  for(i=1; i<=length(lines); i++) { print lines[i] }
}

相关内容