我有一些包含以下数据的文件。
160-68 160 68 B-A OD-CA 3.80247
160-68 160 68 B-A OG-C 3.73454
160-69 160 69 B-A OD1-NZ 2.76641
160-69 160 69 B-A OG-CA 3.54446
160-69 160 69 B-A OE-NZ2 4.24609
160-69 160 69 B-A OG-O 3.97644
160-69 160 69 B-A OG-H 1.82292
我需要在第5列中提取具有以下任何一对OD-NZ,NZ-OD,OE-NZ,NZ-OE,OE-NH,NH-OE的品系。这样做的简单方法是什么?
期望输出
160-69 160 69 B-A OD1-NZ 2.76641
160-69 160 69 B-A OE-NZ2 4.24609
答案 0 :(得分:4)
awk '$5 ~ /OD[0-9]*-NZ[0-9]*|NZ[0-9]*-OD[0-9]*|OE[0-9]*-NZ[0-9]*|NZ[0-9]*-OE[0-9]*|OE[0-9]*-NH[0-9]*|NH[0-9]*-OE[0-9]*/' input.txt
答案 1 :(得分:4)
如果您需要添加/删除/修改您将来感兴趣的任何对,这可能是最简单的。使用GNU awk for gensub():
awk -v pairs="OD-NZ NZ-OD OE-NZ NZ-OE OE-NH NH-OE" '
BEGIN{ split(pairs, tmp); for (i in tmp) pairsArr[tmp[i]] }
gensub(/[[:digit:]]/,"","g",$5) in pairsArr
' file
160-69 160 69 B-A OD1-NZ 2.76641
160-69 160 69 B-A OE-NZ2 4.24609
您可以使用gsub()和任何awk中的变量执行相同的操作。
或者如果您愿意:
awk -v pairs="OD-NZ|NZ-OD|OE-NZ|NZ-OE|OE-NH|NH-OE" '
BEGIN { pairs = "^" gensub(/([-|]|$)/,"[[:digit:]]*\\1","g",pairs) "$" }
$5 ~ pairs
' file
160-69 160 69 B-A OD1-NZ 2.76641
160-69 160 69 B-A OE-NZ2 4.24609
答案 2 :(得分:1)
grep -P 'OD\d?-NZ\d?|NZ\d?-OD\d?|....' file
如果您喜欢使用awk,请获取$5
并使用相同的正则表达式进行检查。