我有一个文本文件,其中包含蛋白质序列信息和相关序列。
>4YDY_1|Chains A, C[auth B]|DARPIN 44C12V5|synthetic construct (32630)
MRGSHHHHHHGSDLGKKLLEAARAGQDDEVRILMANGADVNALDDSGYTPLHLAAEDGHLEIVEVLLKHGADVNAADRLGDTPLHLAAFVGHLEIVEVLLKAGADVNAVDLAGVTPLHVAAFYGHLEIVEVLLKAGADVNAQDKFGKTPADIAADNGHEDIAEVLQKLN
对于这些链,有一个序列。我想遍历文件的每一行并仅保留 ID 和第一个链,删除紧跟在 ID (_1) 后面的实体编号,在 ID 和链之间放置一个逗号,然后删除行中的任何其他内容。此操作应在一行是和一行否时执行。此外,还有一些序列(第二行中的字母)少于 50 个字母。我想删除每个包含少于 50 个字母的序列及其 ID,即其上方的行。
为了清楚起见,这是我在文件中寻找的每个序列的输出:
>4YDY:A
MRGSHHHHHHGSDLGKKLLEAARAGQDDEVRILMANGADVNALDDSGYTPLHLAAEDGHLEIVEVLLKHGADVNAADRLGDTPLHLAAFVGHLEIVEVLLKAGADVNAVDLAGVTPLHVAAFYGHLEIVEVLLKAGADVNAQDKFGKTPADIAADNGHEDIAEVLQKLN
先感谢您。
答案1
这已经过测试并且与您的示例兼容。
#!/bin/bash
# Read the file two lines at a time
while read -r one; do
read -r two
# If the second line is fifty or more characters long
if ((${#two} >= 50)); then
IFS='|' read -ra f <<< "$one"
id="${f[0]}"
# Remove the underscore "_" and everything after it from the ID
id=${id%_*}
# Grab the first chain
chain="${f[1]}"
chain=$(cut -d ' ' -f2 <<<"$chain" | cut -d ',' -f1)
one="$id:$chain"
# Print the two lines in the desired format
printf '%s\n' "$one" "$two"
fi
done < file.txt