2017-08-29 10 views
-2

第1列の数値が第2列と等しいことを確認したい場合は、 "ABC"で終わり、"DEF"で終わっていますが、何度かは"DEFZ#"で終わり、"ABC"######"DEF"または"DEFZ#"の数字は2番目の列に一致する必要があります。誰でも私をここで助けてください。第1列の数値が第2列と等しいかチェックしたい第1列を開始し、次の形式で終了する

マイ入力:

ABC12345DEF|12345|23132331331| 
ABC12345DEFZ1|12345|23132331331| 
ABC12345DEFZ2|12345|23132331331| 
ABC95678DEF|45678|23132331331| 
ABC87887DEF|86187|23132331331| 
ABC89043DEF|89043|23132331331| 
ABC89043DEFZ1|89043|23132331331| 
ABC89043DEFZ2|89043|23132331331| 
ABC89043DEFZ3|89043|23132331331| 

出力は次のようになります。

ABC12345DEF|12345|23132331331| 
ABC12345DEFZ1|12345|23132331331| 
ABC12345DEFZ2|12345|23132331331| 
ABC89043DEFZ1|89043|23132331331|  
ABC89043DEFZ2|89043|23132331331| 
ABC89043DEFZ3|89043|23132331331| 

私は、次のいずれかを使用しようとしているが、それは

awk -F '|' '"ABC" $2 "DEF" == $1 && "ABC" $2 "DEFZ"+[0-9] == $1 { print }' WHTFile.txt > QC2Valid.txt** 

を働いていません誰でもここで私を助けてくれますか? ?事前に おかげ

答えて

0
awk -v FS="|" '{tmpvar=$1;gsub(/^ABC|DEF(Z[0-9]+)?$/,"",tmpvar)}tmpvar == $2' infile 

入力

[email protected]:/tmp$ cat infile 
ABC12345DEF|12345|23132331331| 
ABC12345DEFZ1|12345|23132331331| 
ABC12345DEFZ2|12345|23132331331| 
ABC95678DEF|45678|23132331331| 
ABC87887DEF|86187|23132331331| 
ABC89043DEF|89043|23132331331| 
ABC89043DEFZ1|89043|23132331331| 
ABC89043DEFZ2|89043|23132331331| 
ABC89043DEFZ3|89043|23132331331| 

出力

[email protected]:/tmp$ awk -v FS="|" '{tmpvar = $1; gsub(/^ABC|DEF(Z[0-9]+)?$/,"",tmpvar)} tmpvar == $2' infile 
ABC12345DEF|12345|23132331331| 
ABC12345DEFZ1|12345|23132331331| 
ABC12345DEFZ2|12345|23132331331| 
ABC89043DEF|89043|23132331331| 
ABC89043DEFZ1|89043|23132331331| 
ABC89043DEFZ2|89043|23132331331| 
ABC89043DEFZ3|89043|23132331331| 

説明

awk -v FS="|" '{     # call awk set field separator | 
       tmpvar = $1;  # save first field contents in variable tmpvar 

       # substitute first ABC or DEF 
       # which can be followed by Z and numbers 
       # from variable with null globally 
       # so that tmpvar will just have numbers which is between abc and def* 
       gsub(/^ABC|DEF(Z[0-9]+)?$/,"",tmpvar) 
       } 
       # if tmpvar is equal to second field then 
       # print current record/row/line, thats boolean true, print $0 
       tmpvar == $2 
       ' infile 

Online regex

  • /^ABC|DEF(Z[0-9]+)?/ 1代替^ABC^文字列ABCの開始位置をアサートABC文字通り(大文字と小文字を区別)

  • 2代替DEF(Z[0-9]+)?DEFDEF文字通り(ケース文字に一致する文字にマッチします感受性)第1捕獲グループ(Z[0-9]+)?? Quanti FIER - ゼロと1時間の間の一致、できるだけ多くの回数、必要に応じて恩返し(貪欲)Zは文字通り文字Zに一致する(大文字と小文字を区別)[0-9]+

  • +数量詞下記のリストに存在する単一の文字をマッチ - 可能な限り何回でも一致し、必要に応じて返す(欲張り)

+0

Hey Akshay、期待通りに働いています、ありがとう、それを感謝します。 – kris

+0

ありがとう、ありがとうAkshay – kris

関連する問題