Awk 基于列提取行

Awk 基于列提取行,awk,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 我需要在第

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

 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

如果您喜欢使用awk,可以获得5美元并使用相同的正则表达式进行检查。

如果您将来需要添加/删除/修改任何感兴趣的对,这可能是最简单的。GESUB的GNU awk:

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
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

欢迎来到StackOverflow!关于如何在此处提问,请参阅本帮助:-同时请记住以下几点:您尝试过什么?给我们看一下你的代码,然后我们就能更好地帮助你了。这些对后面有数字吗?多少?ITYM\d->[:位:]:-。我知道你从哪里来,我只是不认为\d会适用于大多数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