【问题标题】:Match two files to get out of range of numbers and within range匹配两个文件以超出数字范围并在范围内
【发布时间】:2017-06-18 15:51:16
【问题描述】:

范围的文件,例如(1 - 4 和 6 - 9 之间的数字):

BlackList_B_Number.dat

1     4
6     9

这是输入文件。例如:

OCS_VOICECALLS_1111_11_111111

111111111    1    201605240042070000000236OCS4252 3.6344   
111111111    2    201605240114430000000123OCS1154 03.0537  
111111111    3    201605240246070000000009OCS0707 018.6965 
111111111    4    201605240530500000000213OCS0130 01.8881  
111111111    5    201605240601120000000015OCS0156 015.8059 
111111111    6    201605240649100000000052OCS0269 02.3725  

我有兴趣从与黑名单输入文件相关的输入文件中过滤 $2。我想得到这两个输出:

Output1(过滤器外的输入记录):

111111111    5    201605240601120000000015OCS0156 015.8059 

输出2(过滤器内的输入记录):

111111111    1    201605240042070000000236OCS4252 3.6344   
111111111    2    201605240114430000000123OCS1154 03.0537  
111111111    3    201605240246070000000009OCS0707 018.6965 
111111111    4    201605240530500000000213OCS0130 01.8881  
111111111    6    201605240649100000000052OCS0269 02.3725 

我尝试了很多选项,但我只得到其中一个选项,而不是两个输出,只有其中一个:

awk '
    FNR==NR{low[NR]=$1+0;hi[NR]=$2+0;next}
   {for(i in low)if($2>=low[i]&&$2<=hi[i]){print $0}}
' BlackList_B_Number.dat OCS_VOICECALLS_1111_11_111111

111111111    1    201605240042070000000236OCS4252 3.6344     1.5570     2.0773     0     000000    0     0JAVIE
111111111    2    201605240114430000000123OCS1154 03.0537    1.8992     1.1545     0     000000    0     0PPIB7
111111111    3    201605240246070000000009OCS0707 018.6965   18.4730    0.2235     0     000000    0     0PPXS8
111111111    4    201605240530500000000213OCS0130 01.8881    0.0000     1.8881     0     000000    0     0PPIB5
111111111    6    201605240649100000000052OCS0269 02.3725    1.7978     0.5746     0     000000    0     0PPIB7

我怎样才能同时得到另一个??:

111111111    5    201605240601120000000015OCS0156 015.8059 

提前致谢!!!

【问题讨论】:

  • 您必须缩进应该逐字打印的文本。否则所有空格都会被挤压,换行符会消失。
  • 另一个问题...您将如何调整或将以前的脚本切换到“program.awk”以便作为 awk -f program.awk 执行?非常感谢。

标签: unix awk numbers match


【解决方案1】:

我会这样写:

filter="in"
awk -v filter="$filter" '
    NR == FNR {
        for (i=$1; i<=$2; i++) wanted[i]
        next
    }
    (filter == "in" && $2 in wanted) || (filter != "in" && !($2 in wanted))
' BlackList_B_Number.dat OCS_VOICECALLS_1111_11_111111

可以使用shell变量$filter来控制。

我不明白你的最后一个问题:如果你想同时进入和退出过滤器,请使用

cat OCS_VOICECALLS_1111_11_111111

【讨论】:

  • 另一个问题...您将如何调整或将以前的脚本切换到“program.awk”以便作为 awk -f program.awk 执行?提前非常感谢
  • 单引号中的所有内容都进入 awk 文件。
【解决方案2】:

我想我现在明白了!!!!!!:

filter="in" awk -v filter="$filter" 'NR==FNR {for (i=$1; i "FILE1"}!($2 in Wanted){print > "FILE2"}' BlackList_B_Number.dat OCS_VOICECALLS_1111_11_111111

猫文件1 111111111 1 201605240042070000000236OCS4252 3.6344
111111111 2 201605240114430000000123OCS1154 03.0537 111111111 3 201605240246070000000009OCS0707 018.6965 111111111 6 201605240530500000000213OCS0130 01.8881 111111111 4 201605240601120000000015OCS0156 015.8059

猫文件2 111111111 5 201605240649100000000052OCS0269 02.3725

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 2018-04-10
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2014-06-18
    • 2012-06-23
    • 2023-03-27
    相关资源
    最近更新 更多