我想删除同名的段落(在我的例子中包含不同的数据串,DNA)。
例如我的文件是:
>blue
1. agccttgatcgttac
2. tttactaaagatgat
3. agccttga
>orange
1. tttactaaagatg
2. agccttgatcgtt
3. tttacta
>blue
1. caatgcatgcaga
2. agccttgatcgtt
3. tttactaaagatg
4. caatgca
我想删除所有同名的段落,只留下其中一个(在这种情况下,其中一个是">"蓝色)。每个段落以">"开头。我怎么能这样做?
答案 0 :(得分:1)
$ awk '/^>/{seen=cnt[$0]++} !seen' file
>blue
1. agccttgatcgttac
2. tttactaaagatgat
3. agccttga
>orange
1. tttactaaagatg
2. agccttgatcgtt
3. tttacta
答案 1 :(得分:0)
我确信,同事们可能会提供更优雅的方式,但这里的内容很快而且很脏:
cat in.txt |grep "^>"|sort|awk ' p == $0; { p = $0 }' >headers.txt
cp in.txt out.txt
while read in; do
cat out.txt| sed "/^$in/,/^>/{//!d}"|sed "/^$in/d" >temp.txt
mv temp.txt out.txt
done < headers.txt
将in.txt
作为输入文件,您将out.txt
作为输出,并在headers.txt
中获取已删除的段落名称列表。
请注意,我删除了所有出现重复命名的段落。
答案 2 :(得分:0)
使用awk
awk -v RS="\">\"" '{c=0;name=name" "$1;split(name,arr);for(i in arr){if(arr[i]==$1){++c}};if(c==1){print RS $0;next}}' file > new_file
示例如果您有数据
">"orange
tttactaaagatg
agccttgatcgtt
tttacta
">"blue
caatgcatgcaga
agccttgatcgtt
tttactaaagatg
caatgca
">"blue
caatgcatgcaga
agccttgatcgtt
tttactaaagatg
caatgca
">"orange
tttactaaagatg
agccttgatcgtt
tttacta
">"green
tttactaaagatg
agccttgatcgtt
tttacta
<强>结果
">"orange
tttactaaagatg
agccttgatcgtt
tttacta
">"blue
caatgcatgcaga
agccttgatcgtt
tttactaaagatg
caatgca
">"green
tttactaaagatg
agccttgatcgtt
tttacta
答案 3 :(得分:0)
对于awk
来说,这是一项简单的工作:
awk '/^>/ { print_it = 0; if (seen[$1]++ == 0) print_it = 1 }
{ if (print_it) print }'
这使第一段保留给定标题。如果你需要保留最后一段这样的段落,你必须更加努力。