从正则表达式中选择数字

发布于 2024-12-03 05:11:14 字数 2539 浏览 0 评论 0原文

我的数据集如下:

Quote:
HBOND SUMMARY 
output to file HB_lowLyo_D_lipid_A_water_001_064.tbl, 
data was sorted, intra-residue interactions are NOT included, 
Distance cutoff is 4.00 angstroms, angle cutoff is 120.00 degrees 
Hydrogen bond information dumped for occupancies > 0.00 

DONOR ACCEPTORH ACCEPTOR 
atom# res@atom atom# res@atom atom# res@atom %occupied distance angle 
| 4645 58@O12 | 23489 1174@H1 23488 1174@O | 22.79 2.945 ( 0.28) 26.79 (14.41) 
| 4645 58@O12 | 23490 1174@H2 23488 1174@O | 22.49 2.965 ( 0.31) 28.01 (14.47) 
| 2701 34@O12 | 23333 1122@H1 23332 1122@O | 20.60 2.965 ( 0.23) 30.07 (14.18) 
| 2701 34@O12 | 23334 1122@H2 23332 1122@O | 19.74 2.963 ( 0.23) 31.43 (13.88) 
| 271 4@O12 | 23334 1122@H2 23332 1122@O | 19.70 2.825 ( 0.19) 21.92 (12.15) 
| 271 4@O12 | 23333 1122@H1 23332 1122@O | 19.55 2.826 ( 0.19) 22.22 (12.71) 
| 4655 58@O16 | 21156 396@H2 21154 396@O | 19.43 2.933 ( 0.22) 31.95 (15.18) 
| 4658 58@O15 | 21156 396@H2 21154 396@O | 18.96 3.163 ( 0.27) 37.03 (14.63) 
| 4310 54@O26 | 23202 1078@H2 23200 1078@O | 18.73 2.821 ( 0.24) 25.87 (13.92) 
| 4655 58@O16 | 21155 396@H1 21154 396@O | 18.63 2.917 ( 0.22) 31.91 (15.00) 
| 1820 23@O16 | 21167 400@H1 21166 400@O | 18.14 2.910 ( 0.22) 27.20 (13.87) 
| 1820 23@O16 | 21168 400@H2 21166 400@O | 17.96 2.907 ( 0.21) 26.69 (13.86) 
| 3845 48@O16 | 23454 1162@H2 23452 1162@O | 17.68 2.991 ( 0.31) 28.45 (14.88) 
| 4658 58@O15 | 21155 396@H1 21154 396@O | 17.31 3.177 ( 0.27) 38.82 (14.69) 
| 3845 48@O16 | 23453 1162@H1 23452 1162@O | 17.29 3.016 ( 0.32) 28.84 (14.57) 
| 1489 19@O13 | 23201 1078@H1 23200 1078@O | 16.66 2.884 ( 0.23) 31.39 (15.56) 
| 3824 48@O26 | 21099 377@H2 21097 377@O | 15.44 2.992 ( 0.30) 30.78 (15.01) 
| 4253 53@O15 | 23454 1162@H2 23452 1162@O | 14.98 2.961 ( 0.27) 33.71 (15.09) 
| 1459 19@O22 | 23201 1078@H1 23200 1078@O | 14.84 3.012 ( 0.33) 35.08 (16.12) 
| 1081 14@O12 | 21173 402@H1 21172 402@O | 14.76 2.937 ( 0.24) 27.54 (14.26) 
| 4253 53@O15 | 23453 1162@H1 23452 1162@O | 14.63 2.955 ( 0.25) 33.68 (15.11) 
| 1081 14@O12 | 21174 402@H2 21172 402@O | 14.41 2.944 ( 0.25) 28.34 (14.35) 
| 3824 48@O26 | 21098 377@H1 21097 377@O | 13.70 3.002 ( 0.30) 31.00 (15.21) 
| 3845 48@O16 | 21156 396@H2 21154 396@O | 13.06 2.934 ( 0.26) 27.71 (14.05)    
. 
.
.

总共约有 40,000 行。

我想选择行,条件是第三个和第六个字段中的数字落在“@”符号之前的 1-64 范围内。

我尝试过使用 awk 类似这样的代码

awk '$3 ~ /^[0-9]/ && $6 ~ /^[0-9]/  {print}'  hhHB_LL1000_D_lipid_A_water_001_064.tbl | head

I have data set as below:

Quote:
HBOND SUMMARY 
output to file HB_lowLyo_D_lipid_A_water_001_064.tbl, 
data was sorted, intra-residue interactions are NOT included, 
Distance cutoff is 4.00 angstroms, angle cutoff is 120.00 degrees 
Hydrogen bond information dumped for occupancies > 0.00 

DONOR ACCEPTORH ACCEPTOR 
atom# res@atom atom# res@atom atom# res@atom %occupied distance angle 
| 4645 58@O12 | 23489 1174@H1 23488 1174@O | 22.79 2.945 ( 0.28) 26.79 (14.41) 
| 4645 58@O12 | 23490 1174@H2 23488 1174@O | 22.49 2.965 ( 0.31) 28.01 (14.47) 
| 2701 34@O12 | 23333 1122@H1 23332 1122@O | 20.60 2.965 ( 0.23) 30.07 (14.18) 
| 2701 34@O12 | 23334 1122@H2 23332 1122@O | 19.74 2.963 ( 0.23) 31.43 (13.88) 
| 271 4@O12 | 23334 1122@H2 23332 1122@O | 19.70 2.825 ( 0.19) 21.92 (12.15) 
| 271 4@O12 | 23333 1122@H1 23332 1122@O | 19.55 2.826 ( 0.19) 22.22 (12.71) 
| 4655 58@O16 | 21156 396@H2 21154 396@O | 19.43 2.933 ( 0.22) 31.95 (15.18) 
| 4658 58@O15 | 21156 396@H2 21154 396@O | 18.96 3.163 ( 0.27) 37.03 (14.63) 
| 4310 54@O26 | 23202 1078@H2 23200 1078@O | 18.73 2.821 ( 0.24) 25.87 (13.92) 
| 4655 58@O16 | 21155 396@H1 21154 396@O | 18.63 2.917 ( 0.22) 31.91 (15.00) 
| 1820 23@O16 | 21167 400@H1 21166 400@O | 18.14 2.910 ( 0.22) 27.20 (13.87) 
| 1820 23@O16 | 21168 400@H2 21166 400@O | 17.96 2.907 ( 0.21) 26.69 (13.86) 
| 3845 48@O16 | 23454 1162@H2 23452 1162@O | 17.68 2.991 ( 0.31) 28.45 (14.88) 
| 4658 58@O15 | 21155 396@H1 21154 396@O | 17.31 3.177 ( 0.27) 38.82 (14.69) 
| 3845 48@O16 | 23453 1162@H1 23452 1162@O | 17.29 3.016 ( 0.32) 28.84 (14.57) 
| 1489 19@O13 | 23201 1078@H1 23200 1078@O | 16.66 2.884 ( 0.23) 31.39 (15.56) 
| 3824 48@O26 | 21099 377@H2 21097 377@O | 15.44 2.992 ( 0.30) 30.78 (15.01) 
| 4253 53@O15 | 23454 1162@H2 23452 1162@O | 14.98 2.961 ( 0.27) 33.71 (15.09) 
| 1459 19@O22 | 23201 1078@H1 23200 1078@O | 14.84 3.012 ( 0.33) 35.08 (16.12) 
| 1081 14@O12 | 21173 402@H1 21172 402@O | 14.76 2.937 ( 0.24) 27.54 (14.26) 
| 4253 53@O15 | 23453 1162@H1 23452 1162@O | 14.63 2.955 ( 0.25) 33.68 (15.11) 
| 1081 14@O12 | 21174 402@H2 21172 402@O | 14.41 2.944 ( 0.25) 28.34 (14.35) 
| 3824 48@O26 | 21098 377@H1 21097 377@O | 13.70 3.002 ( 0.30) 31.00 (15.21) 
| 3845 48@O16 | 21156 396@H2 21154 396@O | 13.06 2.934 ( 0.26) 27.71 (14.05)    
. 
.
.

There are total of about 40,000 lines.

I want to choose lines with the condition the digits in 3rd and 6th field fall in the range between 1-64 before the "@" symbol.

I have tried with the awk something like this code

awk '$3 ~ /^[0-9]/ && $6 ~ /^[0-9]/  {print}'  hhHB_LL1000_D_lipid_A_water_001_064.tbl | head

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橙幽之幻 2024-12-10 05:11:14

如果我正确解释您的输入,这些字段应该落在 [1-64] 范围内:

| 4645 58@O12 | 23489 1174@H1 23488 1174@O | 22.79 2.945 ( 0.28) 26.79 (14.41)
       ^              ^
_______|        ______|

据我所知,您发布的输入中没有任何内容具有此行为...

使用此 awk-脚本:

/^|/{
    split($3, a, "@")
    split($6, b, "@")
    if(a[1] >= 1 && a[1] <= 64 && b[1] >=1 && b[1] <= 64) print
}

如果我向您的输入添加一行:

| 3845 48@O16 | 21156 39@H2 21154 396@O | 13.06 2.934 ( 0.26) 27.71 (14.05)
       ^              ^
_______|        ______|

此脚本输出:

$ awk -f digits.awk digits.txt 
| 3845 48@O16 | 21156 39@H2 21154 396@O | 13.06 2.934 ( 0.26) 27.71 (14.05)

If I interpret your input correctly, these are the fields that should fall within the range [1-64]:

| 4645 58@O12 | 23489 1174@H1 23488 1174@O | 22.79 2.945 ( 0.28) 26.79 (14.41)
       ^              ^
_______|        ______|

As far as I can tell, nothing in you're input that you have posted has this behavior...

Use this awk-script:

/^|/{
    split($3, a, "@")
    split($6, b, "@")
    if(a[1] >= 1 && a[1] <= 64 && b[1] >=1 && b[1] <= 64) print
}

If I add a a line to you're input:

| 3845 48@O16 | 21156 39@H2 21154 396@O | 13.06 2.934 ( 0.26) 27.71 (14.05)
       ^              ^
_______|        ______|

This script outputs:

$ awk -f digits.awk digits.txt 
| 3845 48@O16 | 21156 39@H2 21154 396@O | 13.06 2.934 ( 0.26) 27.71 (14.05)
桜花祭 2024-12-10 05:11:14

试试这个:

awk '$3 ~ /^[0-9]/ && $6 ~ /^[0-9]/ {
        s3 = gensub(/@.*$/, "", "g", $3)
        s4 = gensub(/@.*$/, "", "g", $6)
        if(+s3 <= 64 && +s4 <= 64) print
}' hhHB_LL1000_D_lipid_A_water_001_064.tbl | head

Try this:

awk '$3 ~ /^[0-9]/ && $6 ~ /^[0-9]/ {
        s3 = gensub(/@.*$/, "", "g", $3)
        s4 = gensub(/@.*$/, "", "g", $6)
        if(+s3 <= 64 && +s4 <= 64) print
}' hhHB_LL1000_D_lipid_A_water_001_064.tbl | head
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文