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