2016-02-24 5 views
0

H- Я ищу решение bash/awk/sed для получения подмножеств таблицы на основе уникальных значений столбцов. Например, если у меня есть:получить подмножество таблицы на основе уникальных значений столбцов

chrom1 333 
chrom1 343 
chrom2 380 
chrom2 501 
chrom1 342 
chrom3 102 

Я хочу, чтобы иметь возможность разделить эту таблицу в 3:

chrom1 333 
chrom1 343 
chrom1 342 


chrom2 380 
chrom2 501 


chrom3 102 

Я знаю, как сделать это в R с помощью команды разделения, но я специально искал для решения bash/awk/sed.

Благодаря

ответ

1

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

$ awk '{a[$1]=a[$1]?a[$1] ORS $0:$0} 
    END{for(k in a) print a[k] ORS ORS}' file 

генерирует

chrom1 333 
chrom1 343 
chrom1 342 


chrom2 380 
chrom2 501 


chrom3 102 

есть две пустые строки в конце, но не дис воспроизводится в форматированном выходе.

+0

Нет, это не будет поддерживать первоначальный порядок из-за использования ассоциативного массива – anubhava

+0

Я имел в виду порядок записей в каждом блоке, а не сами блоки. – karakfa

1

Использование sort и awk:

sort -k1,1 file | awk 'NR>1 && p != $1{print ORS} {p=$1} 1' 

EDIT: Если вы хотите сохранить первоначальный порядок записей из входного файла используйте:

awk -v ORS='\n\n' '!($1 in a){a[$1]=$0; ind[++i]=$1; next} 
    {a[$1]=a[$1] RS $0} 
    END{for(k=1; k<=i; k++) print a[ind[k]]}' file 
1

я не знаю, если это awk имеет никакой пользы, но это создаст 3 отдельный файл на основе уникальных значений столбцов:

awk '{print >> $1; close($1)}' file 
+0

вау очень сжато! – brucezepplin

+0

Кстати - вы получаете какой-либо дополнительный контроль над результирующими именами файлов? т. е. добавить конечное '.out' к каждому имени файла? – brucezepplin

+0

Извините за задержку, если вы сделаете 'awk' следующим образом:' awk '{print >> "out _" $ 1; close ($ 1)} ''file .... он будет печатать' out_' перед каждым новым файлом – Chris

0

создать список ввода file.txt

(
cat << EOF 
chrom1 333 
chrom1 343 
chrom2 380 
chrom2 501 
chrom1 342 
chrom3 102 
EOF 
) > file.txt 

transfomation

cat file.txt | cut -d" " -f1 | sort -u | while read c 
do 
cat file.txt | grep "^$c" | sort 
echo 
done 
Смежные вопросы