сортировать по максимуму первых двух столбцов

У меня есть файл, содержащий:

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

как этого можно достичь? Благодарность!

0
14.12.2016, 14:10
4 ответа

Ваш входной файл:

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

С этим вводом будет работать простая сортировка :

$ 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 -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/2 столбца в строке 1 - «3», а максимальное значение в строке 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
28.01.2020, 02:34

Если у вас есть 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] }
}
0
28.01.2020, 02:34

Для числовой сортировки в двух первых столбцах

sort -n -t " " -k1,1 -k2,2 /path/to/file
0
28.01.2020, 02:34

Вы можете сделать это с помощью GNU sort :

sort -k1,1n -k2,2n yourfile
  • -k для указания столбца
0
28.01.2020, 02:34

Теги

Похожие вопросы