【问题标题】:bash, extract string from text file with space delimiterbash,使用空格分隔符从文本文件中提取字符串
【发布时间】:2013-05-29 20:27:07
【问题描述】:

我有一个文本文件,里面有这样一行:

    MC exp. sig-250-0 events         & $0.98 \pm 0.15$          & $3.57 \pm 0.23$              \\

sig-250-0 是可以在文件之间更改的东西(但我总是知道每个文件是什么)。这之前和上面都有几行,但字符串“MC exp.sig-250-0 events”在文件中是唯一的。

对于一个特定的文件,有没有一种好方法可以使用 bash 提取上例中的第二个数字 3.57?

【问题讨论】:

  • 当你说“使用 Bash”时,你真的是说 sed、awk、grep 等不在桌面上吗?或者调用这些工具的 shell 脚本可以吗?
  • 桌面上的所有这些。 bash,我的意思不是 python、C++、perl 等。

标签: string bash extract


【解决方案1】:

为此使用awk

awk '/MC exp. sig-250-0/ {print $10}' your.txt 

请注意,这将打印:$3.57 - 带有前导 $,如果您不喜欢这样,请将输出通过管道传输到 tr

awk '/MC exp. sig-250-0/ {print $10}' your.txt | tr -d '$'

您在 cmets 中写道,您需要在这样的脚本中调用它:

while read p ; do 
    echo $p,awk '/MC exp. sig-$p/ {print $10}' filename | tr -d '$'
done < grid.txt

请注意,您需要一个子 shell $() 用于 awk 管道。像这样:

echo "$p",$(awk '/MC exp. sig-$p/ {print $10}' filename | tr -d '$')

如果您想将 shell 变量传递给 awk 模式,请使用以下语法:

awk -v p="MC exp. sig-$p" '/p/ {print $10}' a.txt | tr -d '$'

【讨论】:

  • 这似乎可以解决问题,我可以用它来去掉前面的 $ 符号吗?
  • 有没有办法逃脱 $10 以免与 bash 命令行输入混淆?
  • 所以我试图在这样的脚本中运行它,由于某种原因它不起作用(但独立命令有效,我怀疑 bash 中的 $10 有问题): while read p;回声 $p,awk '/MC exp. sig-$p/ {print $10}' /susy/tables/tex/MyYieldsTable_$p.tex.bak | tr -d '$';完成
  • 看来我需要在单引号内展开 $p 变量,但不要展开 $10。正因为如此,awk 方法行不通。
  • 还是很困惑,所以最终的命令应该是这样的吧? : 当读 p;回声 $p,$(awk -v p="MC exp. sig-$p" '/p/ {print $10}' /susy/tables/tex/MyYieldsTable_$p.tex.bak | tr -d '$');完成
【解决方案2】:

更多的行会很好,但我猜你想要一个简单的使用 awk。

awk '{print $N}' $file

如果你不告诉 awk 它必须使用什么样的字段分隔符,它将只使用一个空格''。现在你只需要计算你有多少字段来获得你想要的字段。在您的情况下,它将是 10。

awk '{print $10}' file.txt 
$3.57

不想要$? 通过管道将您的 awk 结果剪切:

awk '{print $10}' foo | cut -d $ -f2

-d 将使用 $ als 字段分隔符,-f 将选择第二个字段。

【讨论】:

    【解决方案3】:

    如果你知道你总是有相同数量的字段,那么

    #!/bin/bash
    file=$1
    key=$2
    while read -ra f; do
        if [[ "${f[0]} ${f[1]} ${f[2]} ${f[3]}" == "MC exp. $key events" ]]; then
            echo ${f[9]}
        fi
    done < "$file"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2015-06-19
      • 2016-06-03
      • 2017-12-25
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多