如果位置已知,则提取字符串的子字符串

时间:2017-05-28 09:29:42

标签: string bash

首先,我需要通过file.txt中的已知位置提取子字符串 bash中file.txt,但从第二行开始

>header
cgatgcgctctgtgcgtgcgtgcg

所以让我们假设我想要第二行的位置10,输出应该是:

c

第二,我希望包含周围的±5字符,从而产生

gcgctctgtgc

3 个答案:

答案 0 :(得分:2)

{ read -r; read -r; echo "${REPLY:9:1}"; echo "${REPLY:4:11}"; } < file.txt

输出:

c
gcgctctgtgc

子字符串的${parameter:offset:length}语法在https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion中解释。

https://www.gnu.org/software/bash/manual/bashref.html#index-read中解释了read命令。

输入重定向:https://www.gnu.org/software/bash/manual/bashref.html#Redirections

答案 1 :(得分:1)

使用sed和cut:

sed  -n '2p' file|cut -c 5-15

sed for access 2nd line and cut for print desired characters

答案 2 :(得分:1)

使用awk

要获得位置10的字符,1索引:

awk 'NR==2 {print substr($0, 10, 1)}'
  • NR==2正在检查记录是否为秒,如果是,{}内的语句将被执行

  • substr($0, 10, 1)将从字段$0(整个记录)中的位置10开始提取1个字符,即仅提取第10个字符。 substr()的格式为substr(field, offset, length)

同样,要在10周左右获得±5个字符:

awk 'NR==2 {print substr($0, (10-5), 11)}'

(10-5)代替5只是为了让您了解这些内容。

示例:

% cat file.txt                      
>header
cgatgcgctctgtgcgtgcgtgcg

% awk 'NR==2 {print substr($0, 10, 1)}' file.txt     
c

% awk 'NR==2 {print substr($0, (10-5), 11)}' file.txt
gcgctctgtgc