Awk

搜尋長字元串(>50 個字元)並記錄匹配

  • August 27, 2021

我有一段程式碼查找一個字元串,然後記錄是否匹配。當字元串不超過 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
  • 輸入數據temp25_0.txt如下
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2016 
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2008  
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2013
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2000
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1987
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1965
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555150000555555515515551011155111555115155101155511 2000
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555000551511115555555155155511111551115551151551111555 2007
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111150500 2016
  • want2
51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511
  • dob_want2
2019
  • 所需的輸出是
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

(我知道如果行更短會更容易閱讀,但行長似乎是這裡的全部問題。)任何建議將不勝感激

$1看起來像數字的輸入(例如)是(大致)類型numeric string(aka strnum),因此將根據首次使用的上下文被視為字元串或數字。變數a也是 anumeric string並且第一個使用的地方是比較$1==a根據https://www.gnu.org/software/gawk/manual/gawk.html#Typing-and-Comparison上的比較類型表,strnum 與 strnum 比較被視為數字,但您需要將其視為字元串避免大數字的精度損失,因此您需要將空字元串連接到比較的任一側,以使其成為 strnum 與字元串比較的字元串比較。

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

引用自:https://unix.stackexchange.com/questions/666380