我想检查第1列中的数字是否等于第2列,第1列应该以“ABC”开头并以“DEF”结尾但有时它以“ABC”之间的“DEFZ#”数字结尾######“DEF”或“DEFZ#”应与第二列匹配。请有人帮我。
我的意见
>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 { print }' WHTFile.txt > QC2Valid.txt
答案 0 :(得分:1)
awk 解决方案:
awk -F' *\\| *' '{ match($1,/[0-9]+/) }substr($1,RSTART,RLENGTH)==$2' OFS='|' WHTFile.txt
输出:
ABC12345DEF |12345 |23132331331|
ABC12345DEFZ1 |12345 |23132331331|
ABC12345DEFZ2 |12345 |23132331331|
ABC89043DEF |89043 |23132331331|
ABC89043DEFZ1 |89043 |23132331331|
ABC89043DEFZ2 |89043 |23132331331|
ABC89043DEFZ3 |89043 |23132331331|
使用 sed 表达式Bonus 解决方案:
sed -E '/^ABC([0-9]+)DEF[^\s|]*\s*\|\s*\1/!d' WHTFile.txt
答案 1 :(得分:1)
请您试着跟随并告诉我这是否对您有帮助。
awk -F"|" '
$1 ~ /^ABC[0-9]+DEF[123Z]/ || $1 ~ /^ABC[0-9]+DEF/{
sub(/ +$/,"",$2);
match($1,/[0-9]+/);
if(substr($0,RSTART,RLENGTH)==$2){
print
}
}
' OFS="|" Input_file