我有两个文本文件 A.txt 和 B.txt。A.txt 的每一行都是 A.txt
100
222
398
文本文件
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;
答案1
下面的脚本应该可以解决你的问题:
#!/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
答案2
这是另一种方法:
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
:这将遍历 file2 并打印第三个字段小于当前值的每一行$i
。诀窍是使用选项将变量传递给awk
脚本-v var_name=value
。
请注意,这个(和 Radu 的)答案将打印每个匹配的行每个变量。结果将有许多重复的行,要删除它们,请使用sort
:
while read i; do awk -v i="$i" '$3-i>10' file2; done < file1 | sort -u