#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