【问题标题】:Linux Bash: Use awk(substr) to get parameters from file inputLinux Bash:使用 awk(substr) 从文件输入中获取参数
【发布时间】:2017-11-07 09:36:09
【问题描述】:

我有一个这样的 .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,其次,我无法提取我需要的任何其他参数,因为移动 start 不起作用。 例如。 $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 -

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

【问题讨论】:

  • 你应该edit你的问题删除不必要的部分并专注于你已经尝试过的内容、输入、输出和预期输出。 ATM 很不清楚
  • 不过,我需要展示一下我是如何制作 .txt 文件的。也许,问题可以通过不同的方式来解决?我真的没有计划,我可以从哪里开始解决我的问题,但我会尽量让它更清楚
  • 当你编辑你的问题时提醒我。
  • @Jean-FrançoisFabre 我仍然是 Stack Overflow 的“新手”,ping 是如何工作的?我希望用 @ 标记也能正常工作
  • 但是所有这些变量都会被下一行覆盖,只输出最后一行的值,有什么好处?

标签: linux bash awk substr


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。如果您查看早期版本,我的最终目标是 curl,但我不想在这里发布它,因为我还没有深入研究它并且不希望其他人做我的工作。如果你有兴趣,我最终需要从一个网站获取信息。需要这些参数才能获得正确的信息。我只使用过一次 curl 对 http 响应代码的简单获取请求。所以现在,我想,我需要 POST,我需要它的变量
【解决方案2】:

这个问题最初被标记为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
-

【讨论】:

  • 感谢大家的时间和精力!我会尽力提出更好的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多