基于列提取行

时间:2014-05-09 16:06:44

标签: awk

我有一些包含以下数据的文件。

 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

3 个答案:

答案 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并使用相同的正则表达式进行检查。