AWK - 比较两个不同文件中两个变量的值

时间:2013-10-27 17:32:16

标签: linux bash awk text-processing

我有两个文本文件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;

这样做的任何问题?

2 个答案:

答案 0 :(得分: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

注意,

  • 这是一个快速而肮脏的事情,还有改进的余地。但我认为它会起作用。

答案 1 :(得分: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}'

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