Как объединить две или более строки, если они начинаются с одного и того же слова? - PullRequest
1 голос
/ 20 марта 2019

У меня есть такой файл:

AAKRKA HIST1H1B AAGAGAAKRKATGPP
AAKRKA HIST1H1E RKSAGAAKRKASGPP
AAKRLN ACAT1 LMTADAAKRLNVTPL
AAKRLN SUCLG2 NEALEAAKRLNAKEI
AAKRLR GTF2F1 VSEMPAAKRLRLDTG
AAKRMA VCL NDIIAAAKRMALLMA
AAKRPL WIZ YLGSVAAKRPLQEDR
AAKRQK MTA2 SSSQPAAKRQKLNPA

Я бы хотел объединить 2 строки, если они точно совпадают в 1-м столбце.Желаемый результат:

AAKRKA HIST1H1B,HIST1H1E AAGAGAAKRKATGPP,RKSAGAAKRKASGPP
AAKRLN ACAT1,SUCLG2 LMTADAAKRLNVTPL,NEALEAAKRLNAKEI
AAKRLR GTF2F1 VSEMPAAKRLRLDTG
AAKRMA VCL NDIIAAAKRMALLMA
AAKRPL WIZ YLGSVAAKRPLQEDR
AAKRQK MTA2 SSSQPAAKRQKLNPA

Иногда может быть более двух строк, начинающихся с одного и того же слова.Как я могу достичь желаемого результата с помощью bash / awk?

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Поскольку это напоминает SQL, как групповые операции, вы можете использовать sqlite, который доступен в bash

с заданными входами

$ cat aqua.txt
AAKRKA HIST1H1B AAGAGAAKRKATGPP
AAKRKA HIST1H1E RKSAGAAKRKASGPP
AAKRLN ACAT1 LMTADAAKRLNVTPL
AAKRLN SUCLG2 NEALEAAKRLNAKEI
AAKRLR GTF2F1 VSEMPAAKRLRLDTG
AAKRMA VCL NDIIAAAKRMALLMA
AAKRPL WIZ YLGSVAAKRPLQEDR
AAKRQK MTA2 SSSQPAAKRQKLNPA

$

Сценарий:

$ cat ./sqlite_join.sh
#!/bin/sh
sqlite3 << EOF
create table data(a,b,c);
.separator ' '
.import $1 data
select a, group_concat(b) , group_concat(c) from data group by a;
EOF

$ 

Результаты

$ ./sqlite_join.sh aqua.txt
AAKRKA HIST1H1B,HIST1H1E AAGAGAAKRKATGPP,RKSAGAAKRKASGPP
AAKRLN ACAT1,SUCLG2 LMTADAAKRLNVTPL,NEALEAAKRLNAKEI
AAKRLR GTF2F1 VSEMPAAKRLRLDTG
AAKRMA VCL NDIIAAAKRMALLMA
AAKRPL WIZ YLGSVAAKRPLQEDR
AAKRQK MTA2 SSSQPAAKRQKLNPA

$
1 голос
/ 21 марта 2019

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

{ second[$1] = second[$1] "," $2; third[$1] = third[$1] "," $3 }
END { for (i in second) print i, substr(second[i],2), substr(third[i],2) }

Я не делал никаких предположений о порядке ввода или вывода.Если вы хотите отсортировать вывод, направьте вывод через sort.Вы можете запустить программу на https://ideone.com/sbgLNk.

0 голосов
/ 20 марта 2019

попробуйте это:

DATAFILE=data.txt

cut -d " " -f1 < $DATAFILE | sort | uniq |
while read key; do
    column1="$key"
    column2=""
    column3=""
    grep "$key" $DATAFILE |
    while read line; do
        set -- $line
        [ -n "$column2" ] && [ -n "$2" ] && column2="$column2,"
        [ -n "$column3" ] && [ -n "$3" ] && column3="$column3,"
        column2="$column2$2"
        column3="$column3$3"        
        echo "$column1 $column2 $column3"
    done | tail -n1
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...