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

标签 linux bash awk substr

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

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

我想提取以下内容作为参数:

-'中小企业'

-'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 给出空的 echo 。我期望 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 -

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

最佳答案

真的不清楚你到底想做什么。但我至少可以帮助您使用 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

您应该能够弄清楚如何获取其余字段。

这是一种相当低效的方法,但根据问题中的信息,我目前无法提供更好的答案。

关于Linux bash : Use awk(substr) to get parameters from file input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154381/

相关文章:

php - 电子邮件服务器;这种方法对垃圾邮件安全吗?

linux - 在远程主机上使用非返回脚本管理进程

mysql - 如何调用此 shell 脚本将 mysqldump 转换为 SQLite 兼容语法

mysql - 在 NodeJS 中生成交互式进程并退出

bash - 有没有一种方法可以实现不接受参数但根据名称长度而变化的 bash 函数?

c++ - 反转数据顺序

file - 从 awk 脚本打印文本 block 到文件 [banner like]

awk - 打印带有重复单词的行

mysql - 在bash脚本中查询MySQL SHOW GRANTS包括本地文件

linux - 如何制作不捕获任何事件的叠加层