如何檢查第 1 列中記錄開頭的 2 個字符是否與第 2 列中字串的第 5 和第 6 個字符匹配?我嘗試了一種使用 substr 的方法,但是由于我是 bash 腳本的新手,所以我不確定如何提取中間字符。
我的代碼
awk 'BEGIN{OFS=FS="|"} { $2!="" str=substr($2, length($2) -7,9)
if ( $1 ~ /^str/) print}' file
貓檔案
CZ987876654534|HDFCCZPXXXX|Czech Republic|1243765
9785764654|HDFCCZPXXXX|United Kingdom|84320
LU987876986576|BSUILUPXXXX|Australia|8765
YZ654S|BSUIDEPXXXX|Germany|98744
QA76465346||Qatar|9877654
GB875765||Europe|98679867
預期輸出:
CZ987876654534|HDFCCZPXXXX|Czech Republic|1243765
LU987876986576|BSUILUPXXXX|Australia|8765
注意 - $2 列的長度始終為 11,因為它是 BIC。
uj5u.com熱心網友回復:
假設/理解:
- 第一列永遠不會為空/null
- 第二列 (aka
BIC) 可以是 a) 為空/null 或 b) 正好包含 11 個字符
一個awk想法:
$ awk -F'|' 'substr($1,1,2) == substr($2,5,2)' file
CZ987876654534|HDFCCZPXXXX|Czech Republic|1243765
LU987876986576|BSUILUPXXXX|Australia|8765
如果兩個substr()呼叫生成相同的模式,則測驗評估為“真”并且當前輸入行被傳遞到標準輸出(即,當前輸入行被列印)。
uj5u.com熱心網友回復:
使用sed
$ sed -n '/\(..\)[^|]*|....\1/p' input_file
CZ987876654534|HDFCCZPXXXX|Czech Republic|1243765
LU987876986576|BSUILUPXXXX|Australia|8765
uj5u.com熱心網友回復:
match在 GNU 中使用函式awk。
awk 'match($0,/^(..)[^|]*\|.{4}(..)/,arr) && arr[1] == arr[2]' Input_file
說明:簡單的解釋是,使用match函式 ofawk,其中匹配正則運算式^(..)[^|]*\|.{4}(..)(下面將完整解釋并在陣列 arr 中創建 2 個捕獲組;這會創建 arr 的 2 個元素)。連同那個(&&有條件)檢查條件,如果 arr 的第一個元素等于 arr 的第二個元素,然后列印該行(實際上沒有提到列印,因為awk適用于條件/正則運算式和操作的方法以及滿足條件時沒有提到動作然后列印當前動作將發生)。
正則運算式的解釋:
^(..) ##From starting of line matching any 2 characters and keeping then in 1st capturing group.
[^|]*\|.{4} ##Matching everything before 1st occurrence of | followed by | and 4 any characters.
(..) ##Creating 2nd capturing group which captures any 2 characters in it.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492663.html
