Intereting Posts
Не удается открыть общую папку в Debian (VirtualBox) Сессия экрана не работает при отсоединении Выбор файлов, начинающихся с $ LETTER, или буквы позже, чем $ LETTER в алфавите изменение переменной среды, как PATH навсегда Контролируйте точность процентного соотношения CPU или MEM в верхней части? В Ubuntu есть ли способ практически объединить две папки без unionfs или aufs? RSync – исключение конкретного подкаталога и его дочерних элементов, где подкаталог существует на разных уровнях Хранить массив в файл и загружать массив из файла в BASH Как hardlink и softlink работают в фоновом режиме? Как удалить шлюз из таблицы маршрутизации по умолчанию, используйте systemd где моя память в Linux? Проблемы с разрешением Nvidia 9800GT и HP w1907v проблемы безопасности при установке из исходного кода с правами root Udev не переименовывает USB-устройство Ethernet Тестирование любого из семейства связанных значений в переменной Bash

Как отсортировать поток данных по двум именам столбцов (номер столбца может отличаться)?

Я получаю поток данных из 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 

Есть идеи?

Вы могли бы сделать что-то вроде:

  # 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 

Благодаря идеям из комментариев и других источников я наконец смог написать этот код и ответить на мой собственный вопрос:

  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 

Он работает следующим образом: он принимает данные потока, находит номера нужных столбцов и выводит перед каждой строкой оба значения, необходимые для сортировки. Затем он сортирует 1-й и 2-й столбцы и удаляет их. Благодаря!