【问题标题】:bash / awk : filter value from fieldbash / awk :从字段中过滤值
【发布时间】:2022-06-11 09:09:11
【问题描述】:

我正在尝试从 FILEDIGITS.txt 中过滤出第 2 列的数字范围。

for i in `seq -f '%0.f\n' 66979300 100 66982300`; do
awk -v var=$i 'BEGIN{FS=OFS="\t"}{$2 == var }{print $0 }' FILEDIGITS.txt >> FILTERED.txt                        
done

尽管没有过滤,FILTERED.TXT 与 FILEDIGITS.TXT 相同。

我检查了请求的值存在于 FILEDIGITS.TXT 的第 2 列中,然后过滤应该会成功。

我哪里错了? 非常感谢您的帮助!

【问题讨论】:

    标签: bash loops awk filter


    【解决方案1】:

    你知道这个很棒的页面吗? Awk - A Tutorial and Introduction - by Bruce Barnett - Grymoire

    试试这个(编辑见@AndrejPodzimek的评论):

    for i in `seq -f '%0.f\n' 66979300 100 66982300`; do
      awk 'BEGIN {FS=OFS="\t"} ; $2 == var' var="${i}" FILEDIGITS.txt >> FILTERED.txt                        
    done
    

    【讨论】:

    • 旁注:{print $0} 不需要。
    • @AndrejPodzimek 回答已修改:谢谢
    【解决方案2】:

    如果您只处理这些数字中的 31 个,不妨一次性将其全部分块:

     . . . input_data . . . | 
    
     {m,g}awk '!_<NF' FS="^[^\t]*[\t]($(jot -s'|' - 66979300 66982300 100))[\t]"
    

    .

    ps : use jot if u can instead of seq
    

    该子 shell 调用创建了一个类似于此的 FS

    FS: "^[^\t]*[\t](66979300|66979400|66979500|66979600|66979700|
                     66979800|66979900|66980000|66980100|66980200|
                     66980300|66980400|66980500|66980600|66980700|
                     66980800|66980900|66981000|66981100|66981200|
                     66981300|66981400|66981500|66981600|66981700|
                     66981800|66981900|66982000|66982100|66982200|66982300)[\t]"
    

    您可以制作各种数字范围,例如:

     FS: "^[^\t]*[\t](11111|15555|19999|24443|28887|33331|37775|42219|
                      46663|51107|55551|59995|64439|68883|73327|77771|
                      82215|86659|91103|95547|99991|""""104435|108879|
                            113323|117767|122211|126655|131099|135543|
                            139987|144431|148875|153319|157763|162207|
                            166651|171095|175539|179983|184427|188871|
                            193315|197759|202203|206647|211091|215535|
                            219979|224423|228867|233311|237755|242199|
                            246643|251087|255531|259975|264419|268863|
                            273307|277751|282195|286639|291083|295527|
                     299971|304415|308859|313303|317747|322191|326635|331079)[\t]"
    

    设置OFS 是多余的,因为这纯粹是一个过滤器,不需要任何自定义操作语句。

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多