Сортировка столбца на основе значения другого

#awk

#awk

Вопрос:

У меня есть файл со следующей структурой:

Ввод

 1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 T:0.966667  A:0.0333333 T
 

Что я хотел бы сделать, так это изменить положение пятого и шестого столбцов таким образом, чтобы один столбец получил порядок, идентичный порядку седьмого столбца. Вы можете видеть в примере. В седьмом столбце у нас есть T, C, T, и после изменения шестой столбец из T, C, A изменился на T, C, T в выходных данных, то есть в третьей строке положение пятого и шестого столбцов изменилось по сравнению с седьмым колонна.

Вывод

 1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 A:0.0333333 T:0.966667  T
 

Надеюсь, я смог четко объяснить, я не смог найти решение, не могли бы вы дать мне подсказку, как это сделать?

Заранее благодарю вас.

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

1. Итак, вы всегда хотите, чтобы 6-й столбец следовал порядку 7-го столбца?

2. По сути, я хочу изменить порядок одного из 5-го или 6-го столбца, чтобы он имел точно такой же порядок букв, что и в 7-м столбце, неважно, является ли это 5-м или 6-м. Спасибо.

3. Как вы ожидаете решить, какой из столбцов изменить порядок? И вы всегда будете просто заменять значение другим столбцом, чтобы это произошло?

4. кроме того, что происходит, когда ни один из двух столбцов не соответствует последнему столбцу?

Ответ №1:

Использование выходных данных в качестве разделителей табуляции и выравнивание всех столбцов.

 awk -F'[ :]*'  '{if($7 == $9 ) print $1,$2,$3,$4,$5,$6,$7,$8,$9; else print $1,$2,$3,$4,$7,$8,$5,$6,$9}' input.txt|column -t
 

Вывод:

 1  30923  2  300  G  0.503333   T  0.496667   T
1  51476  2  300  T  0.986667   C  0.0133333  C
1  51479  2  300  A  0.0333333  T  0.966667   T
 

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

1. Это отлично работает. Только один вопрос, как я могу сделать вывод однородным, то есть все строки печатаются как третья, так, как вы удалили «:». Я бы также напечатал столбцы в формате, разделенном табуляцией. Большое вам спасибо.

Ответ №2:

Если я правильно понимаю, может быть, это сработает для вас?

: файл a.awk

 substr($6,1,1) == $7 { print }
substr($6,1,1) != $7 { print $1, $2, $3, $4, $6, $5, $7 }
 

: файл a.txt

 1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 T:0.966667  A:0.0333333 T
 

bash-3.2 $ awk -f a.awk a.txt

 1   30923   2   300 G:0.503333  T:0.496667  T
1   51476   2   300 T:0.986667  C:0.0133333 C
1   51479   2   300 A:0.0333333 T:0.966667  T