搜索长字符串(>50 个字符)并记录匹配

dp0*_*p0b 2 awk pattern-matching

我有一段代码,用于查找字符串,然后记录是否匹配。当字符串不超过 50 个字符时,代码工作正常。然而,在此之上,例如对于 100 或 150 个字符的字符串,它仅基于字符串中的前 50 个字符而不是完整的 100/150 个字符进行匹配。

有没有办法确保它根据完整的字符串长度计算匹配项?我正在使用一个awk程序,因为当前的分数基于出生日期并且小于一列,然后是长字符串匹配。

want2=$( awk '{print $4}' temp10_0.txt | head -1 )
dob_want2=$(head -1 year.txt )
awk -v a="$want2" -v b="$dob_want2" '{ if ($1==a && $2<=b) print $0, "1";else print $0, "0"}' temp25_0.txt>  temp11_0.txt
Run Code Online (Sandbox Code Playgroud)
  • 输入数据temp25_0.txt如下
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2016 
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2008  
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2013
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2000
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1987
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1965
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555150000555555515515551011155111555115155101155511 2000
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555000551511115555555155155511111551115551151551111555 2007
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111150500 2016
    
    Run Code Online (Sandbox Code Playgroud)
  • want2
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511
    
    Run Code Online (Sandbox Code Playgroud)
  • dob_want2
    2019
    
    Run Code Online (Sandbox Code Playgroud)
  • 期望的输出是
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2016 1
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2008 1  
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2013 1
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2000 1
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1987 1
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1965 1
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555150000555555515515551011155111555115155101155511 2000 0
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555000551511115555555155155511111551115551151551111555 2007 0
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111150500 2016 0
    
    Run Code Online (Sandbox Code Playgroud)

(我知道如果行更短会更容易阅读,但行长似乎是这里的全部问题。)任何建议将不胜感激

Ed *_*ton 6

$1看起来像数字的输入(例如)属于类型(大致)numeric string(又名strnum),因此将被视为字符串或数字,具体取决于首次使用它的上下文。变量a也是 anumeric string并且使用的第一个地方是在比较中$1==a。根据https://www.gnu.org/software/gawk/manual/gawk.html#Typing-and-Comparison 上的比较类型表,strnum 与 strnum 比较被视为数字,但您需要将其视为字符串才能避免大数字的精度损失,因此您需要将一个空字符串连接到比较的任一侧,以使其成为字符串比较的 strnum vs 字符串比较。

awk -v a="$want2" -v b="$dob_want2" '{ print $0, ($1==(a"") && $2<=b) }'
Run Code Online (Sandbox Code Playgroud)