代码之家  ›  专栏  ›  技术社区  ›  bapors

查找列是否在范围内

  •  2
  • bapors  · 技术社区  · 7 年前

    我有两个文件,我想知道file1的列是否在列的范围内。

    file1.txt
    1 19
    1 21
    1 24
    2 22
    4 45
    
    file2.txt
    1 19 23 A
    1 20 28 A
    4 42 45 A
    

    我想看看 1st column 属于 file1.txt 是一样的 第一栏 属于 file2.txt ,是否 second column 属于 文件1.TXT 介于两者之间 2nd and 3rd columns 属于 文件2.TXT ,如果在范围内则追加。

    所以输出应该是:

    output.txt
    
    1 19 23 A 1 19
    1 19 23 A 1 21
    1 20 28 A 1 24
    4 42 45 A 4 45
    

    我试图找出第一列是否相同:

    awk 'NR==FNR{c[$1]++;next};c[$1] > 0' file1.txt file2.txt 
    
    1 19 23 A
    1 20 28 A
    4 42 45 A
    

    但我不能把更大/更小的条件。 如何添加?

    3 回复  |  直到 7 年前
        1
  •  1
  •   RavinderSingh13 Nikita Bakshi    7 年前

    以下内容也可能对您有所帮助。

    while read first second
    do
      awk -v fir="$first" -v sec="$second" '$1==fir && ($2<=sec && $3>=sec){print $0,fir,sec}' file2
    done < "file1"
    
        2
  •  1
  •   KamilCuk    7 年前

    使用join+awk:

    join file2.txt file1.txt | awk '{if ($2 <= $5 && $5 <= $3) { print $1,$2,$3,$4,$1,$5 } }'
    

    前两个文件连接到第一列,然后比较列并打印输出(第一列打印两次,因为join隐藏了它)。

        3
  •  1
  •   oliv    7 年前

    使用 awk :

    $ awk 'NR==FNR{a[$1]=a[$1]" "$2;next} {split(a[$1],b);for(i in b) if(b[i]>=$2 && b[i]<=$3) print $0,$1,b[i]}' file1 file2
    1 19 23 A 1 19
    1 19 23 A 1 21
    1 20 28 A 1 21
    1 20 28 A 1 24
    4 42 45 A 4 45
    

    第一个block语句将file1的元素存储到数组中 a . 数组索引是文件的第一列,数组元素是第二列的所有数字与第一列中相同数字的连接。

    第二个block语句在数组上循环 与第一列具有相同索引并检查数组中的数字的元素位于范围之间。


    另一种方法是 join :

    $ join -o 1.1 1.2 1.3 1.4 1.1 2.2 file2 file1 | awk '$6 >= $2 && $6 <= $3'
    1 19 23 A 1 19
    1 19 23 A 1 21
    1 20 28 A 1 21
    1 20 28 A 1 24
    4 42 45 A 4 45
    

    join -o 生成了预期的输出格式。这个 AWK 语句正在筛选 范围内的线条。