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

Linux Bash: Use awk(substr) to get parameters from file input

我有一个这样的 .txt 文件:

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

我想提取以下参数:

-'SMb'

-'171765'

-'171864'

-'-'(减号)

-> 需要它们不带引号

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

#!/bin/sh
file=

cat ""|while read line; do
  echo "$line"
  parent=$(awk {'print substr($line,[=13=],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=

cat ""|while read line; do
  parent=$(awk {'print substr($line,[=15=],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 -

我有一个假设,行中的项目被视为单个字符串之类的?也许我也错误地处理了文件解析,但我尝试的一切都不起作用。

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

while read -r line
do 
    parent=$(echo $line | awk '{print substr(,2,3)}')
    start=$(echo $line | awk '{print substr(,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
-