Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LinuxBash:使用awk(substr)从文件输入获取参数_Linux_Bash_Awk_Substr - Fatal编程技术网

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

LinuxBash:使用awk(substr)从文件输入获取参数,linux,bash,awk,substr,Linux,Bash,Awk,Substr,我有一个.txt文件,如下所示: 'SMb_TSS0303' '171765' '171864' '-' 'NC_003078' 'SMb20154' 'SMb_TSS0302' '171758' '171857' '-' 'NC_003078' 'SMb20154' substr(s, a, b)=>returns b number of chars from string s, starting at position a 我想提取以下参数: -

我有一个.txt文件,如下所示:

'SMb_TSS0303'   '171765'    '171864'    '-' 'NC_003078' 'SMb20154'  
'SMb_TSS0302'   '171758'    '171857'    '-' 'NC_003078' 'SMb20154'
substr(s, a, b)=>returns b number of chars from string s, starting at position a
我想提取以下参数:

-“中小企业”

-‘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的工作原理如下:

'SMb_TSS0303'   '171765'    '171864'    '-' 'NC_003078' 'SMb20154'  
'SMb_TSS0302'   '171758'    '171857'    '-' 'NC_003078' 'SMb20154'
substr(s, a, b)=>returns b number of chars from string s, starting at position a
首先,我不明白,为什么我可以用0-5提取“Smb”,其次,我不能提取我需要的任何其他参数,因为移动起始点不起作用。 例如,$1,6给出空回声。我希望是Mb_TSS

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

真的不清楚您到底想做什么。但我至少可以在
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
您应该能够了解如何获取其余字段


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

这个问题最初被标记为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
will-to那样拆分行,只考虑前4个字段,去掉引号,以创建列表。然后以换行符分隔显示

上面印着:

SMb
171765
171864
-
SMb
171758
171857
-

你应该把你的问题去掉不必要的部分,把重点放在你已经尝试过的东西上,即输入、输出和预期的输出。虽然ATM非常不干净,但我需要展示一下我是如何制作.txt文件的。也许,问题可以通过不同的方式解决?我真的没有计划,在哪里可以开始解决我的问题,但当你编辑你的问题时,我会尽量让我更清楚。@Jean Françoisfare我对堆栈溢出还是“新手”,Ping是如何工作的?我希望用@works作为标签,但所有这些变量都将被下一行覆盖,只输出最后一行的值,有什么好处?谢谢。如果您查看早期版本,我的最终目标是curl,但我不想在这里发布它,因为我还没有深入研究它,也不希望其他人做我的工作。如果你感兴趣,我需要在最后从一个网站获得信息。需要这些参数才能获得正确的信息。我只在http响应代码的简单get请求中使用过curl。所以现在,我想,我需要帖子,我需要它的变量谢谢大家的时间和努力!我会尽我所能提出更好的问题!