【问题标题】:How to take only numbers in file by Shell script如何通过 Shell 脚本仅获取文件中的数字
【发布时间】:2025-12-03 16:20:02
【问题描述】:

我的问题是找人出席,但他两次给出了他的日期,错误的模式是 jul2222jul。我想证明两者是一样的。

attendF 文件数据看起来像 -

PersonsName,month
sriram,jul22 
sriram,22jul 

我的想法:首先我采用他在 attendF 文件中给出的月份模式
#grep -i "personName" attendF | cut -t"," -k2,2 > mnthFile

mnthFile 有如下数据:

 jul22
 jul23
 22jul
 jul24
 23 jul

我希望输出是:
7月22日
7 月 23 日
7 月 24 日
(或)
7 月 22 日
7 月 23 日
7月24日
在那里我可以得到他的正确出席。

【问题讨论】:

  • 您到底希望输出是什么?为什么不像输入 mnthFile 那样输入呢?
  • 这看起来像是一道作业题或面试题。到目前为止,您尝试过哪些不起作用的方法?
  • 我是 shell 脚本和 unix 命令的新手。我阅读了 uniq 和 sort 和 grep 的所有手册页。但我没有找到解决方案
  • 我们不需要知道您读过什么,我们需要知道您尝试过什么。
  • 这个问题有点错误,因为可能有 2 个 Sriram 会在同一天到来,他们应该有一些独特的东西,至少不卷或类似的东西会以某种模式出现。最好的方法是拒绝此类输入。

标签: bash shell unix command sh


【解决方案1】:

如果您询问如何将不同的日期标准化为单一格式以便进行比较,以下normalise 函数(以及一个小型测试工具)将为您解决。

它首先将字符串小写,然后删除所有既不是字母也不是数字的字符。

那么,如果它既不是alpha-number也不是number-alpha,它只是返回一个合适的错误值?

但是,假设它其中一种格式,它会将其分成日和月,然后以一致的格式返回:

#!/usr/bin/env bash

normalise() {
        # Lowercase it and remove non-alphanumerics.

        str="$(echo "$1" | tr '[A-Z]' '[a-z]' | sed 's/[^a-z0-9]//g')"

        # Check one of the allowed formats.

        if [[ ! "${str}" =~ ^[0-9]+[a-z]+$ ]] ; then
                if [[ ! "${str}" =~ ^[a-z]+[0-9]+$ ]] ; then
                        echo '?'
                        return
                fi
        fi

        # Extract the day andd month, return normalised value.

        day="$(echo "$str" | sed 's/[a-z]//g')"
        mon="$(echo "$str" | sed 's/[0-9]//g')"
        echo "${day}-${mon}"
}

echo $(normalise "Jul 22")
echo $(normalise "jUl-22")
echo $(normalise "juL22")
echo $(normalise "Jul.22")
echo $(normalise "22 jUl")
echo $(normalise "22-juL")
echo $(normalise "22Jul")
echo $(normalise "22.jUl")
echo $(normalise "22.jUl.1977")

该脚本的输出是:

22-jul
22-jul
22-jul
22-jul
22-jul
22-jul
22-jul
22-jul
?

【讨论】: