【问题标题】:Extract all numbers from a text file and store them in another file从文本文件中提取所有数字并将它们存储在另一个文件中
【发布时间】:2014-03-06 05:52:05
【问题描述】:

我有一个包含很多行的文本文件。我想从该文件中提取所有数字。 文件包含文本和数字,每行仅包含一个数字。 如何在 bash 脚本中使用 sed 或 awk?

我试过了

#! /bin/bash
sed 's/\([0-9.0-9]*\).*/\1/' <myfile.txt >output.txt

但这没有用。

【问题讨论】:

    标签: regex bash sed awk


    【解决方案1】:

    grep 可以处理这个:

    grep -Eo '[0-9\.]+' myfile.txt 
    

    -o 告诉只打印匹配项,[0-9\.]+ 是匹配数字的正则表达式。

    将所有数字放在一行并保存在 output.txt 中:

    echo $(grep -Eo '[0-9\.]+' myfile.txt) >output.txt
    

    文本文件通常应以换行符结尾。上面使用echo 可以确保发生这种情况。

    非 GNU grep:

    如果您的 grep 不支持 -o 标志,请尝试:

    echo $(tr ' ' '\n' <myfile.txt | grep -E '[0-9\.]+') >output.txt
    

    这使用tr 将所有空格替换为换行符(因此每个数字单独出现在一行上),然后使用grep 搜索数字。

    【讨论】:

    • 我将输出放入 out.txt by >。但这会使输出保持在不同的行中。我想用空格将所有输出保持在同一行
    【解决方案2】:
    tr -sc '0-9.' ' ' "$file"
    

    将每个非数字或句点字符的字符串转换为一个空格。

    【讨论】:

    • 这很好,但留下了文字。我认为所需的方法是:tr -dc '[:digit:]\n'tr -dc '0-9\n'
    • @WilliamPursell 离开文本是什么意思? OP 说(在他对 John1024 的回答的评论中)他希望所有输出都在一行上。
    • 我误解了您的解决方案,这很棒。我应该先执行它!如果我能再次投票,我会的。
    【解决方案3】:

    你也可以使用 Bash:

    while read line; do
        if [[ $line =~ [0-9\.]+ ]]; then
            echo $BASH_REMATCH
        fi
    done <myfile.txt >output.txt
    

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多