У меня есть два текстовых файла 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
Я ищу команду awk для этого:
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;
Вот еще один подход:
while read i; do awk -v i="$i" '$3-i>10' file2; done < file1
Объяснение:
while read i; do ... ; done < file1
: Это перебирает файл один, сохраняя найденное значение ( вся линия) как $i
. awk -v i=$i '$3-i>10' file2
: он проходит через файл2 и печатает каждую строку, где третье поле меньше текущего значения $i
. Хитрость заключается в передаче переменной в скрипт awk
с опцией -v var_name=value
. Обратите внимание, что этот ответ (и ответ Раду) напечатает каждую строку, соответствующую каждой переменной . Результатом будет множество дублированных строк, для удаления их используйте sort
:
while read i; do awk -v i="$i" '$3-i>10' file2; done < file1 | sort -u
Следующий скрипт должен решить вашу проблему:
#!/bin/bash
A="$HOME/a.txt"
B="$HOME/b.txt"
cat $A | while read a; do
cat $B | while read b; do
b3=$(echo $b | awk ' { print $3 }')
c=$(($b3 - $a))
if (( $c > 10 )); then
echo $b
fi
done
done
Не забудьте сделать его исполняемым с помощью следующей команды:
chmod +x script_name