Сортировка только по ячейкам таблицы в bash

#bash #shell #sorting #unix

#bash #оболочка #сортировка #unix

Вопрос:

Мне нужно разместить ячейки каждого 2-го и 3-го столбцов в отсортированном порядке. Таким образом, мне нужно поменять местами X [N] [2] и X [N] [3], если X [N] [2]> X [N] [3], где X — матрица, N — любое натуральное число.:

 A 9 1 2
B 8 7 F
C 2 4 X
D 3 1 1
 

Мне нужно получить это:

 A 1 9 2
B 7 8 F
C 2 4 X
D 1 3 1
 

Таким образом, порядок строк остался прежним, но некоторые ячейки X [i] [2] и X [i] [3] поменялись местами.

Я думал об использовании конвейера с вырезанием и сортировкой xargs, но, похоже, это не очень хорошая идея. Есть предложения, где копать?

Комментарии:

1. не уверен, о чем cells идет речь, matrix и table file … выглядит как плоский файл со строками и столбцами … чего мне не хватает? вы упомянули xargs , cut и sort … пожалуйста, опубликуйте код, написанный до сих пор; предполагая, что это всего лишь плоский файл, и вы хотите поменять местами / упорядочить столбцы 2 и 3, я бы, вероятно, посмотрел на использование awk (также взгляните на awk's ternary operator)


Ответ №1:

Это можно решить с помощью небольшого скрипта awk:

 # Swap X[N][2] and X[N][3] if X[N][2] > X[N][3]
$2 > $3 {
  tmp = $3
  $3 = $2
  $2 = tmp
}

# Print row
1
 

Чтобы использовать его в скрипте или оболочке как однострочный: awk '$2 > $3 { tmp = $3; $3 = $2; $2 = tmp } 1' inputfile.txt

Ответ №2:

 awk '$2 > $3 {  temp3=$3;$3=$2;$2=temp3 }1' file
 

Использование awk. Если второе поле, разделенное пробелом, больше третьего, установите временную переменную (temp3) в третье поле, разделенное пробелом, установите 3-е поле вторым, а второе — временной переменной. Выведите все строки с короткой рукой 1