linux awk内部的变量操作

vuktfyat  于 2023-03-01  发布在  Linux
关注(0)|答案(4)|浏览(141)

我写了一个脚本,目的是从列表中过滤出一些特定的数据,现在我想让这个脚本“通用”。我遇到的问题是awk内部的变量。原始脚本中的行是:

awk '{if ($2>127931962 && $3<127932966 || $2>127996058 && $3<127997050 || $2>128098961 && $3<128099960) print}'  file.input > file.output

我想要的是用户能够在括号内输入自己的参数,这样他们就可以根据自己的需要过滤数据。
所以我尝试引入一个变量,用户可以在其中输入括号内的信息,但是awk没有过滤掉这些信息。

read region
awk -v reg="$region" '{if (reg) print}' file.input > file.output

当我运行它时,我写道:$2>127931962 && $3<127932966 || $2>127996058 && $3<127997050 || $2>128098961 && $3<128099960作为区域变量的输入,但输出文件与其应有的文件有很大不同。
这是输出文件外观的简短版本(与输入文件相同)

chr8    127930849       127930868
chr8    127931470       127931489
chr8    127931566       127931591
chr8    127931835       127931864
chr8    127932730       127932832
chr8    127932932       127932959
chr8    127933558       127933606
chr8    127933643       127933703
chr8    127933933       127933964
chr8    127934398       127934441
chr8    127938801       127938829
chr8    127939525       127939567
chr8    127939831       127939861
chr8    127939982       127940052
chr8    127940599       127940667
chr8    127940793       127940801
chr8    127941253       127941281
chr8    127942688       127942701
chr8    127943013       127943087
chr8    127943120       127943150
chr8    127943869       127943898
chr8    127943970       127944025
chr8    127944110       127944145
chr8    127944601       127944653
chr8    127945071       127945107
chr8    127945219       127945251
chr8    127945476       127945505
chr8    127946041       127946068
chr8    127946929       127946959
chr8    127947647       127947726
chr8    127948225       127948260
chr8    127948305       127948329
chr8    127948817       127948819
chr8    127949074       127949151
chr8    127949778       127949840
chr8    127949860       127949882
chr8    127949974       127949985
chr8    127950185       127950200
chr8    127950597       127950630
chr8    127951362       127951398
chr8    127951432       127951490
chr8    127951575       127951612
chr8    127951699       127951744
chr8    127953387       127953400
chr8    127953575       127953603
chr8    127953872       127953918
chr8    127953944       127953967
chr8    127954312       127954357
chr8    127954711       127954759
chr8    127955363       127955435
chr8    127956912       127956956
chr8    127957652       127957700
chr8    127957763       127957845
chr8    127957861       127957923
chr8    127958039       127958099
chr8    127958612       127958631
chr8    127959113       127959137
chr8    127959790       127959859
chr8    127960003       127960043
chr8    127960134       127960150
chr8    127960209       127960253
chr8    127960534       127960575
chr8    127960673       127960676
chr8    127960964       127960998
chr8    127961096       127961131
chr8    127961245       127961260
chr8    127961443       127961554
chr8    127961636       127961687
chr8    127961806       127961833
chr8    127962640       127962659
chr8    127962947       127963009
chr8    127963630       127963650
chr8    127963689       127963857
chr8    127963983       127964056
chr8    127964314       127964351
chr8    127964845       127964881
chr8    127965043       127965078
chr8    127965436       127965472
chr8    127965715       127965742
chr8    127965780       127965825
chr8    127966280       127966348
chr8    127966429       127966438
chr8    127966509       127966541
chr8    127966902       127966941
chr8    127967110       127967124
chr8    127967165       127967185
chr8    127967328       127967369
chr8    127968417       127968454
chr8    127969238       127969298
chr8    127969444       127969480
chr8    127971434       127971460
chr8    127971888       127971969
chr8    127974432       127974478
chr8    127975488       127975521
chr8    127975897       127975937
chr8    127976398       127976414
chr8    127979577       127979644
chr8    127980065       127980114
chr8    127980370       127980409
chr8    127981172       127981208
chr8    127981779       127981795
chr8    127983603       127983628
chr8    127983894       127983907
chr8    127986216       127986259
chr8    127989050       127989084
chr8    127989396       127989467
chr8    127989479       127989542
chr8    127990103       127990133
chr8    127990222       127990230
chr8    127990364       127990369
chr8    127990496       127990526
chr8    127990577       127990627
chr8    127990851       127990913
chr8    127992550       127992592
chr8    127993294       127993328
chr8    127993675       127993694
chr8    127994293       127994309
chr8    127994688       127994759
chr8    127996207       127996249
chr8    127996269       127996290
chr8    127996382       127996388
chr8    127996563       127996584
chr8    127996730       127996750
chr8    127996777       127996855
chr8    127996868       127996875
chr8    127997078       127997092
chr8    127998007       127998021
chr8    127999104       127999140
chr8    127999332       127999412
chr8    128001461       128001467
chr8    128001985       128002075
chr8    128004411       128004443
chr8    128005521       128005594
chr8    128005681       128005711
chr8    128006503       128006542
chr8    128008720       128008846
chr8    128009697       128009699
chr8    128009849       128009875
chr8    128010431       128010480
chr8    128010507       128010536
chr8    128010651       128010674
chr8    128010764       128010837
chr8    128011861       128011881
chr8    128011947       128011979
chr8    128012172       128012222
chr8    128012728       128012739
chr8    128013389       128013438
chr8    128013625       128013632
chr8    128014048       128014070
chr8    128014181       128014216
chr8    128014274       128014357
chr8    128014526       128014583
chr8    128014659       128014702
chr8    128014741       128014764
chr8    128015013       128015049
chr8    128016027       128016076
chr8    128016455       128016468
chr8    128017138       128017171
chr8    128017283       128017317
chr8    128017459       128017488
chr8    128017614       128017648
chr8    128017770       128017781
chr8    128017784       128017827
chr8    128018091       128018130
chr8    128018374       128018425
chr8    128018549       128018583
chr8    128018606       128018730
chr8    128019372       128019433
chr8    128019701       128019738
chr8    128019917       128019942
chr8    128020493       128020519
chr8    128020776       128020815
chr8    128020955       128020970
chr8    128020998       128021043
chr8    128021096       128021119
chr8    128021653       128021664
chr8    128021804       128021856
chr8    128021874       128021918
chr8    128022132       128022189
chr8    128022236       128022250
chr8    128022459       128022473
chr8    128022617       128022660
chr8    128024100       128024144
chr8    128024825       128024832
chr8    128025115       128025156
chr8    128025342       128025402
chr8    128025965       128026009
chr8    128026746       128026768
chr8    128027151       128027205
chr8    128028047       128028061
chr8    128028426       128028458
chr8    128028759       128028804
chr8    128028863       128028898
chr8    128030421       128030506
chr8    128030604       128030626
chr8    128030670       128030679
chr8    128031229       128031304
chr8    128031413       128031486
chr8    128032121       128032136
chr8    128032284       128032301
chr8    128032506       128032511
chr8    128032576       128032579
chr8    128032746       128032779
chr8    128032980       128033047
chr8    128033329       128033381
chr8    128033951       128033977
chr8    128034307       128034325
chr8    128034513       128034554
chr8    128034940       128034986
chr8    128035280       128035297
chr8    128035749       128035824
chr8    128035896       128035924
chr8    128036506       128036545
chr8    128036586       128036619
chr8    128036713       128036739
chr8    128036989       128037053
chr8    128037311       128037326
chr8    128037606       128037627
chr8    128037990       128038045
chr8    128038372       128038413
chr8    128038491       128038541
chr8    128038705       128038775
chr8    128039144       128039172
chr8    128039888       128039928
chr8    128040111       128040146
chr8    128041045       128041087
chr8    128041125       128041160
chr8    128041858       128041878
chr8    128041910       128041958
chr8    128042351       128042472
chr8    128043440       128043476
chr8    128044241       128044261
chr8    128044844       128044897
chr8    128045167       128045193
chr8    128045384       128045419
chr8    128046080       128046111
chr8    128047597       128047613
chr8    128048745       128048794
chr8    128049126       128049174
chr8    128049176       128049192
chr8    128049444       128049483
chr8    128051155       128051190
chr8    128051297       128051347
chr8    128051464       128051486
chr8    128052121       128052127
chr8    128052649       128052706
chr8    128053083       128053143
chr8    128053319       128053363
chr8    128054084       128054115
chr8    128054459       128054485
chr8    128054738       128054779
chr8    128055454       128055495
chr8    128055651       128055677
chr8    128055718       128055755
chr8    128056285       128056296
chr8    128056360       128056391
chr8    128057004       128057045
chr8    128057273       128057315
chr8    128057676       128057711
chr8    128058298       128058353
chr8    128058509       128058548
chr8    128059258       128059301
chr8    128059968       128060005
chr8    128060510       128060538
chr8    128061457       128061462
chr8    128061583       128061649
chr8    128061768       128061784
chr8    128061998       128062040
chr8    128062794       128062848
chr8    128062871       128062906
chr8    128062941       128062959
chr8    128063113       128063123
chr8    128064324       128064352
chr8    128065677       128065725
chr8    128065777       128065817
chr8    128065868       128065908
chr8    128066672       128066726
chr8    128071471       128071484
chr8    128071766       128071818
chr8    128072861       128072876
chr8    128074175       128074210
chr8    128076452       128076469
chr8    128077214       128077266
chr8    128077988       128078018
chr8    128081166       128081221
chr8    128086286       128086332
chr8    128088636       128088662
chr8    128090615       128090658
chr8    128091762       128091773
chr8    128091893       128091917
chr8    128094952       128094985
chr8    128095198       128095226
chr8    128095344       128095390
chr8    128095573       128095670
chr8    128095769       128095803
chr8    128095861       128095908
chr8    128096424       128096462
chr8    128096747       128096781
chr8    128096960       128096988
chr8    128097064       128097103
chr8    128099904       128099920
chr8    128100008       128100016
chr8    128100513       128100607
chr8    128100840       128100919
chr8    128101086       128101124
chr8    128101177       128101193
chr8    131904404       131904433
chr8    131909271       131909320

它应该是这样的(注意第2列和第3列在参数范围内):

chr8    127932730       127932832 
chr8    127932932       127932959 
chr8    127996207       127996249 
chr8    127996269       127996290 
chr8    127996382       127996388 
chr8    127996563       127996584
chr8    127996730       127996750
chr8    127996777       127996855
chr8    127996868       127996875
chr8    128099904       128099920

有人能解释一下我做错了什么吗?

fwzugrvs

fwzugrvs1#

不要在shell中编写awk语法,然后让shell在awk看到它之前将其解释为awk脚本的一部分,因为这是两个工具的紧密耦合,并打开了隐藏问题的大门。相反,只需在shell中定义范围列表,然后将范围列表从shell传递到awk,并编写awk脚本来决定如何处理它们,例如,使用任何awk:

regions='127931962-127932966 127996058-127997050 128098961-128099960'

awk -v regions="$regions" '
    BEGIN {
        n = split(regions,regs,/[ -]+/)
    }
    {
        for ( i=1; i<n; i+=2 ) {
            if ( (regs[i] < $2) && ($3 < regs[i+1]) ) {
                print
                next
            }
        }
    }
' file.input > file.output
$ cat file.output
chr8    127932730       127932832
chr8    127932932       127932959
chr8    127996207       127996249
chr8    127996269       127996290
chr8    127996382       127996388
chr8    127996563       127996584
chr8    127996730       127996750
chr8    127996777       127996855
chr8    127996868       127996875
chr8    128099904       128099920

您的脚本中的问题是尝试在awk脚本中使用shell变量-请参阅How do I use shell variables in an awk script?以了解更多信息。

6pp0gazn

6pp0gazn2#

我想解释一下

read region
awk -v reg="$region" '{if (reg) print}' file.input > file.output

它确实将 * reg * 变量视为字符串,因为它不是空字符串,所以被视为真值,请考虑以下简单示例,假设file.txt内容为

1
2
3
4
5
6
7
8
9
10

那么

con="$1>=5"
awk -v con="$con" '{if (con) print}' file.txt

给出输出

1
2
3
4
5
6
7
8
9
10
  • (在GNU Awk 5.0.1中测试)*
wydwbb8l

wydwbb8l3#

您可以通过连接构建awk脚本:

read region
awk '{if ('"${region}"') print}' file.input > file.output

编辑这是不寻常的,请参阅其他可行解决方案的答案(@Ed Morton的答案)

fquxozlt

fquxozlt4#

@Nikolas:你基本上是想创造这样的规则吗

  • $2具有绝对下限,并且
  • $3是否在$2 + (0.0775 to 0.0785 bps)范围内?

相关问题