Разделить файл на Строки на основе значений столбца

Интересно, что это за цвет при установке, может ли кто-нибудь пролить свет?

Цвета ls могут представляют разрешения, по умолчанию для некоторых систем на зеленом фоне отображаются каталоги, в которых у всех есть права на запись:

Вы можете изменить цвет по умолчанию, как показано ниже:

Экспорт базы данных цветов каталога:

dircolors --print-database > ~/.mydircolors

Откройте его с помощью ваш любимый редактор ( nano ~ / .mydircolors ), Измените или добавьте недостающее расширение файла по своему усмотрению, затем откройте свой .bashrc :

Закомментируйте следующие строки, чтобы get:

# You may uncomment the following lines if you want `ls' to be colorized:
 export LS_OPTIONS='--color=auto'
 eval "`dircolors`"
 alias ls='ls $LS_OPTIONS'
 alias ll='ls $LS_OPTIONS -l'
 alias l='ls $LS_OPTIONS -lA'

Измените eval " dircolors " на:

eval "`dircolors ~/.mydircolors`"

Сохранить и выйти.

2
06.08.2017, 23:09
4 ответа

Это можно сделать с помощью grep:

grep -e '^chr4\s\+[3-7]' input

где выражение представляет собой:^chr4строк, начинающихся с chr4, \s\+один или несколько пробелов, [3-7]соответствует одной цифре в диапазоне от 3 до 7.

Возможно, более полезным будет использовать headили tail, чтобы получить столько строк, сколько вы хотите, вместо того, чтобы сопоставлять их с помощьюgrep(с использованием grep только для сопоставления первого столбца ).

grep -e '^chr4\s\+' input| tail -n +3| head -n 5

grepсоответствует строкам, начинающимся с chr4, tailдает строки, начинающиеся с 3-й строки, и при использовании headограничивает вывод первыми 5 строками (строки с 3 по 7 ).

4
27.01.2020, 21:48

Решение для потенциально несортированного входного файла:

sort -k1,1 -k2,2n file | awk '$1=="chr4" && $2>2 && $2<8'

Выход:

chr4    3    C    435
chr4    4    A    223
chr4    5    T    400
chr4    6    G    300
chr4    7    G    340

Если входной файл отсортирован, достаточно использовать:

awk '$1=="chr4" && $2>2 && $2<8' file
9
27.01.2020, 21:48

awk, вероятно, лучший инструмент для работы. Простое решение, похожее на уже данное, но который на самом деле использует указанные вами параметры, это:

awk '$1=="chr4" && $2>=3 && $2<=7'

Вы можете предпочесть более общее решение, который включает в себя размещение команды awkв сценарии оболочки,:

#!/bin/sh
if [ "$#" -lt 3 ]
then
        echo "Usage:    $0 chromosome low_position high_position"
        exit 1
fi
chr="$1"
lo="$2"
hi="$3"
shift 3
awk -vchromo="$chr" -vpos1="$lo" -v pos2="$hi" '$1==chromo && $2>=pos1 && $2<=pos2' "$@"

При запуске с менее чем тремя аргументами это напоминает вам, какими должны быть аргументы, и завершает работу. В противном случае он сохраняет первые три аргумента в переменных оболочки, а затем убирает их из списка аргументов. Затем он вызывает awk, передавая значения переменных оболочки как переменные awk.

Вы можете вызвать это любым из следующих способов::

./myscript chr4 3 7   data

или

./myscript chr4 3 7 < data

или

(some_other_process) |./myscript chr4 3 7
и, в любом случае, перенаправить вывод в новый файл с помощью >.
7
27.01.2020, 21:48

Вы можете использовать утилиту split.

split -p 'chr4    (3|8)' -a 1 my_file output
  • splitфайл на несколько частей (в основном обратныйcat)
  • pдля разделения на расширенное регулярное выражение 'chr4 (3|8 )'
  • -a 1для суффикса созданных файлов с одним символом
  • output— префикс имени каждого создаваемого файла

Теперь файл outputbбудет содержать желаемый результат. Вы также можете изменить это, чтобы поместить каждый хромосом в отдельный файл.

0
27.01.2020, 21:48

Теги

Похожие вопросы