Linux Bash:使用awk(substr)从文件input中获取参数

我有这样一个.txt文件:

'SMb_TSS0303' '171765' '171864' '-' 'NC_003078' 'SMb20154' 'SMb_TSS0302' '171758' '171857' '-' 'NC_003078' 'SMb20154' 

我想提取以下参数:

-'SMb”

-'171765'

-'171864'

' – '(减号)

– >需要他们没有报价

我正在尝试在shell脚本中执行此操作:

 #!/bin/sh file=$1 cat "$1"|while read line; do echo "$line" parent=$(awk {'print substr($line,$0,5)'}) echo "$parent" done echos 'SMb 

据我了解awk substr,我会这样工作:

 substr(s, a, b)=>returns b number of chars from string s, starting at position a 

首先,我不明白,为什么我可以用0-5来提取Smb,其次,我不能提取任何我需要的参数,因为移动开始不起作用。 例如$ 1,6给出空回声。 我期望Mb_TSS

期望的最终产出:

 #!/bin/sh file=$1 cat "$1"|while read line; do parent=$(awk {'print substr($line,$0,5)'}) start=$(awk{'print subtrs($line,?,?')}) end=$(awk{'print subtrs($line,?,?')}) strand=$(awk{'print subtrs($line,?,?')}) done echo "$parent" -> echos SMb echo "$start" -> echos 171765 echo "$end" -> echos 171864 echo "$strand" -> echos - 

我有一个假设,行中的项目被视为单个string或东西? 也许我也是错误地处理文件parsing,但我所尝试的一切不工作:(

提前致谢

真的不清楚你想要做什么。 但我至少可以帮助你使用awk语法:

 while read -r line do parent=$(echo $line | awk '{print substr($1,2,3)}') start=$(echo $line | awk '{print substr($2,2,6)}') echo $parent echo $start done < file 

这输出:

 SMb 171765 SMb 171758 

你应该能够弄清楚如何得到其余的字段。

这是一个相当低效的方法来做到这一点,但基于这个问题的信息,我目前无法提供更好的答案。

问题是标记为python,所以让我提出一个python解决方案:

 with open("input.txt") as f: for l in txt: data = [x.strip("'").partition("_")[0] for x in l.split()[:4]] print("\n".join(data)) 

它打开文件,像awk那样拆分行,只考虑4个第一个字段,去掉引号,创建列表。 然后用换行符分隔显示它。

打印:

 SMb 171765 171864 - SMb 171758 171857 -