Bash 如果两行或多行以同一个单词开头,如何合并它们?
我有这样一个文件:Bash 如果两行或多行以同一个单词开头,如何合并它们?,bash,awk,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 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实现所需的输出
谢谢你的帮助 试试这个:
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
DATAFILE=data.txt
cut-d”“-f1<$DATAFILE | sort | uniq|
读键时;做
column1=“$key”
column2=“”
column3=“”
grep“$key”$DATAFILE|
读行时;做
设置--$line
[-n“$column2”]&&&[-n“$2”]&&column2=“$column2,”
[-n“$column3”]&&&&[-n“$3”]&&column3=“$column3,”
column2=“$column2$2”
column3=“$column3$3”
回显“$column1$column2$column3”
完成|尾部-n1
完成
因为这类似于类似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
$
脚本:
这是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
。您可以在运行该程序。重复的行是否总是连续的?哇,这很有魅力。我不知道sqlite,但一定要学习@水。。很高兴它帮助了你。。是的,sqlite可以比awk更好地解决此类问题。。
$ ./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
$
{ 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) }