簡體   English   中英

使用 awk 將第 2 列的子字符串與第 1 列匹配

[英]Match substring of column 2 with column 1 using awk

如何檢查第 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。

假設/理解:

  • 第一列永遠不會為空/null
  • 第二列(又名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()調用生成相同的模式,則測試評估為“真”,並將當前輸入行傳遞給標准輸出(即,打印當前輸入行)。

使用sed

$ sed -n '/\(..\)[^|]*|....\1/p' input_file
CZ987876654534|HDFCCZPXXXX|Czech Republic|1243765
LU987876986576|BSUILUPXXXX|Australia|8765

在 GNU awk中使用match函數。

awk 'match($0,/^(..)[^|]*\|.{4}(..)/,arr) && arr[1] == arr[2]' Input_file

說明:簡單的解釋是,使用awkmatch函數,其中匹配正則表達式^(..)[^|]*\|.{4}(..) (下面將完全解釋並在數組 arr 中創建 2 個捕獲組; 創建 2 個 arr 元素)。 如果 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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM