bash:使用另一个文件的结果计算数字

时间:2015-08-25 11:33:06

标签: bash

我有两个文本日志文件,第一个file1格式为:

domain=yahoo       user=tom
domain=apple       user=mary
domain=apple       user=tom
domaine=facebook   user=kevin
    ...

和第二个file2

name=tony apply=yes
name=tony apply=yes
name=mary apply=yes
name=tony apply=yes
name=tom  apply=yes
...

现在我想从第二个文件中获取总行数,其中用户的域等于" yahoo",我该怎么办?

3 个答案:

答案 0 :(得分:0)

# put the name that belongs to the domain=yahoo in a file
grep -n "domain=yahoo" file1 | cut -d = -f3 > result
# initialize counter
total=0
# loop over file with names and increment the counter with the number of matches
for name in $(cat result); do
    ((total+=$(grep -n "$name" file2 | wc -l)))
done

@drvtiny指出了另一个(更短)版本的方向:

grep "domain=yahoo" file1 |     # search for the pattern \
    cut -d = -f3 |              # get the third field (name) from the output \
    grep -v '^$'  |             # remove any blank lines that might creep in \
    sort |                      # sort the result, so we can see duplicates \
    uniq > result               # remove duplicates and write the results to a file

grep --count --file=result file2

grep --file=FILE将从上述文件中获取模式,一行在一行 --count返回匹配行数

答案 1 :(得分:0)

不规则的输入文件格式使问题稍微复杂化。通常,要么按指定顺序具有静态列数,要么按任意顺序具有一系列关键字=值对。假设列是固定的,我们可以通过简单的substr()调用忽略keyword = part。

awk 'NR==FNR && $1 == "domain=yahoo" { a[substr($2,6)]=1; next }
    substr($1,6) in a { x++; next } END { print x }' file1 file2

脚本的一般结构是公共NR==FNR成语的直接实现。 Stack Overflow上有很多这样的问题;见例如exporting your data to BigQuery举个例子。

答案 2 :(得分:-1)

我的/ tmp / log是:

domain=yahoo       user=tom
domain=apple       user=mary
domain=apple       user=tom
domain=facebook   user=kevin
domain=apple   user=tony

我的/ tmp /名称是:

name=tony apply=yes
name=tony apply=yes
name=mary apply=yes
name=tony apply=yes
name=tom  apply=yes
name=kevin  apply=yes

script.sh是:

#!/bin/bash
DOMAIN=$1
LOG_FILE=$2
NAME_FILE=$3
REGEXP="$(sed -nr "/domain=$DOMAIN/s%^.*user=([^[:space:]]+).*$%\1%p" "$LOG_FILE" | sort | uniq | tr '\n' '|' | sed 's%|$%%')"
[[ $REGEXP ]] || {
 echo 'No such domain in log file' >&2
 exit 1
}
egrep -c "name=(${REGEXP})([[:space:]]|$)" "$NAME_FILE"

使用参数运行脚本:

./script.sh apple /tmp/log /tmp/name

你会得到这个结果:

5