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