如果以相同的单词开头的两行或更多行如何合并?

时间:2019-03-20 14:46:07

标签: bash awk

我有一个像这样的文件:

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

如果第一行中的两行完全相同,我想合并两行。所需的输出是:

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 个答案:

答案 0 :(得分:1)

由于它类似于类似于SQL的组操作,因此您可以使用bash中可用的sqlite

具有给定的输入

$ 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 :(得分:1)

这是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上运行程序。

答案 2 :(得分:0)

尝试一下:

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