-2

我有两个文本文件 A.txt 和 B.txt。每一行 A.txt A.txt

100
222
398

B.txt

1  2  103  2 
4  5  1026 74
7  8  209  55
10 11 122  78

我正在寻找的是这样的:

for each line of A 
    search B;
    if (the value of third column in a line of B - the value of the variable in A > 10)
        print that line of B;

任何 awk 这样做?

4

2 回答 2

2

这样的事情怎么样

我在理解你的问题时遇到了一些麻烦,但也许这会给你一些指示,

#!/bin/bash 

# Read intresting values from file2 into an array, 
for line in $(cat 2.txt | awk '{print $3}') 
do 
  arr+=($line)
done 

# Linecounter, 
linenr=0 

# Loop through every line in file 1, 
for val in $(cat 1.txt) 
do 
  # Increment linecounter, 
  ((linenr++)) 

  # Loop through every element in the array (containing values from 3 colum from file2) 
  for el in "${!arr[@]}"; 
  do
    # If that value - the value from file 1 is bigger than 10, print values
    if [[ $((${arr[$el]} - $val )) -gt 10 ]] 
    then
      sed -n "$(($el+1))p" 2.txt
      # echo "Value ${arr[$el]} (on line $(($el+1)) from 2.txt) - $val (on line $linenr from 1.txt) equals  $((${arr[$el]} - $val )) and is hence bigger than 10" 
    fi 
   done
done

笔记,

  • 这是一件快速而肮脏的事情,还有改进的余地。但我认为它会完成这项工作。
于 2013-10-27T19:50:58.817 回答
1

像这样使用 awk:

cat f1
1
4
9
16

cat f2
2 4 10 8
3 9 20 8
5 1 15 8
7 0 30 8

awk 'FNR==NR{a[NR]=$1;next} $3-a[FNR] < 10' f1 f2
2 4 10 8
5 1 15 8

更新:基于 OP 的编辑问题:

awk 'FNR==NR{a[NR]=$1;next} {for (i in a) if ($3-a[i] > 10) print}'

并了解与嵌套 for 循环相比,基于 awk 的解决方案有多简单。

于 2013-10-27T17:56:02.360 回答