首页 > 解决方案 > 我怎样才能从文本中提取一些信息

问题描述

我有一个像这样的文本文件

sp|O15304|SIVA_HUMAN MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET IGPDGR
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL NKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWM

我正在尝试将这两组的第三部分小写。我尝试了以下但不起作用

awk '{ gsub($3, tolower($3)); print $1"\t"$2}'

我有一台Mac,还有其他方法吗?

标签: bash

解决方案


使用读取声明为小写的变量。

在所有这些示例中,我打印了括在方括号 ( []) 中的部分,以便您可以看到它是如何解析的,我只是在它们之间放置空格。您可以编辑所有这些。重要的部分是了解定义分隔的内容并将正确的部分放入将其小写的变量中。

declare -l three
while IFS='|' read -r one two three
do echo "[$one] [$two] [$three]"
done < infile
[sp] [O15304] [siva_human mpkrscpfadvaplqlkvrvsqrelsrgvcaerysqevfektkrllflgaqayldhvwdegcavvhlpespkpgptgapraargqmligpdgrlirslgqaseadpsgvasiacsscvravdgkavcgqceralcgqcvrtcwgcgsvactlcglvdcsdmyekvlctscamfet igpdgr]
[tr] [A0A1B1L9R9] [a0a1b1l9r9_bactu mnkqlflaslketqksilsyacgaalylwlliwifpsmvsakglneliaampdsvkkivgmespiqnvmdflageyysllfiiiltifcvtvathliarhvdkgamayllatpvsrvqiaitqatvlilglliivsvtyvaglvgaewflqdnnlnkelflkinivggliflvvsaysfffscicnderkalsysasltilffvldmvgklsdklewmknlslftlfrpkeiaegayniwpvsigliagalcifivaivvfkkrdlpl nkelflkinivggliflvvsaysfffscicnderkalsysasltilffvldmvgklsdklewm]

如果您只想要管道之后但空格之前的部分 - 并且格式一致 -

declare -l three
while IFS='| ' read -r one two three four
do echo "[$one] [$two] [$three] [$four]"
done < infile
[sp] [O15304] [siva_human] [MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET IGPDGR]
[tr] [A0A1B1L9R9] [a0a1b1l9r9_bactu] [MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL NKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWM]

如果您想要的只是空格后的最后一位,那么默认分隔符就可以了。

declare -l three
while read -r one two three
do echo "[$one] [$two] [$three]"
done < infile
[sp|O15304|SIVA_HUMAN] [MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET] [igpdgr]
[tr|A0A1B1L9R9|A0A1B1L9R9_BACTU] [MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL] [nkelflkinivggliflvvsaysfffscicnderkalsysasltilffvldmvgklsdklewm]

推荐阅读