Как отсортировать несколько строк от самого низкого до самого высокого значения? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь взять несколько наборов данных с более чем 800 строками и отсортировать каждую строку от самого низкого до самого высокого значения.Каждая строка в данных относится к одному гену / набору вариантов (хромосома: position_reference / alternative, например 22: 42721284_C / T), разделенных таб.Первый элемент в каждой строке - это ген (например, gene1, gene2, gene3 и т. Д.), А остальная часть строки предназначена для идентификаторов вариантов, записанных в форме 22: 42721284_C / T.Сколько существует вариантов для каждого гена, будет варьироваться.Файл, который у меня есть, сейчас сортируется по убыванию (42721284, 42721258, 42721203), но я хочу отсортировать файл по убыванию.

Мой файл:

Gene1 22:42721284_C/T 22:42721258_A/G 22:42721203_A/G …etc
Gene2 22:50483983_C/T 22:50483960_C/G 22:50483951_C/T …etc
Gene3 22:24429129_A/G 22:24428893_A/G 22:24428885_C/T …etc

Я пробовал разные черные команды (например, черный -V), но я не получаю вывод от низшего к высшему.Я бы предпочел решение awk (или gawk), но я совершенно новичок в кодировании, поэтому любая помощь будет принята с благодарностью.

Желаемый результат:

Gene1 22:42721203_A/G 22:42721258_A/G 22:42721284_C/T …etc
Gene2 22:50483951_C/T 22:50483960_C/G 22:50483983_C/T …etc 
Gene3 22:24428885_C/T 22:24428893_A/G 22:24429129_A/G …etc

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

С GNU awk для asort ():

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    printf "%s%s", $1, OFS
    sub("^[^"FS"]*"FS,"")
    split($0,vars)
    n = asort(vars)
    for (i=1; i<=n; i++) {
        printf "%s%s", vars[i], (i<n ? OFS : ORS)
    }
}

$ awk -f tst.awk file
Gene1   22:42721203_A/G 22:42721258_A/G 22:42721284_C/T …etc
Gene2   22:50483951_C/T 22:50483960_C/G 22:50483983_C/T …etc
Gene3   22:24428885_C/T 22:24428893_A/G 22:24429129_A/G …etc
0 голосов
/ 23 мая 2019
  • xargs для каждой строки в файле запуска
  • sh -c сценарий оболочки
  • first="$1"; shift сохранить первый аргумент для более позднего
  • printf "%s\n" "$@" - вывести остальные аргументы в отдельных строках
  • sort - отсортировать по алфавиту
  • tr "\n" " " | sed "s/ $//" - заменить новые строки пробелами и удалить завершающий перевод новой строки.
  • напечатать выводс printf

Сценарий:

cat <<EOF >file
Gene1 22:42721284_C/T 22:42721258_A/G 22:42721203_A/G
Gene2 22:50483983_C/T 22:50483960_C/G 22:50483951_C/T
Gene3 22:24429129_A/G 22:24428893_A/G 22:24428885_C/T
EOF

<file xargs -l -P1 sh -c '
    first=$1
    shift
    printf "%s %s\n" "$first" "$(
        printf "%s\n" "$@" |
        sort |
        tr "\n" " " | sed "s/ $//"
    )"
' -- >output

# the same using plain bash while read loop
if false; then
while IFS=' ' read -r first rest; do
    echo "$first" "$(
        <<<"$rest" tr ' ' '\n' |
        sort |
        tr "\n" " " | sed "s/ $//"
    )"
done <file >output
fi

cat <<EOF >expected
Gene1 22:42721203_A/G 22:42721258_A/G 22:42721284_C/T
Gene2 22:50483951_C/T 22:50483960_C/G 22:50483983_C/T
Gene3 22:24428885_C/T 22:24428893_A/G 22:24429129_A/G
EOF

diff output expected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...