Bash匹配来自两个文件的行

时间:2014-04-16 19:38:42

标签: bash match lines

我有两个文件:

File_1.txt

PROCESS1 1234
PROCESS2 1235
PROCESS3 1236
PROCESS4 1237

File_2.txt

1.2.3.4 1234
1.2.3.5 1235
1.2.3.6 1236
1.2.3.7 1234
1.2.3.8 1234
1.2.3.9 1235
1.2.3.8 1234
1.2.3.8 1234

第一个文件,有一个进程名称和它的pid,第二个文件也有一个IP和一个PID。 我需要的是从第二个文件中的第一个文件中找到匹配的PID,并像这样输出somenthing

Desired_output.txt

PROCESS1 1234 1.2.3.4 1
PROCESS1 1234 1.2.3.8 3
PROCESS2 1235 1.2.3.5 1
PROCESS2 1235 1.2.3.9 1
PROCESS3 1236 1.2.3.6 1
PROCESS4 1237  - 0 

其中,第一列是进程名称,第二列是PID,第三列是文件中的ips,第四列是ip在file_2.txt中列出的时间

提前致谢

2 个答案:

答案 0 :(得分:2)

尝试使用join命令,让你做到这一点。

我能想到的唯一限制是必须对文件进行排序。因此,如果您不关心保留输出行的顺序,可以使用join

手册页:http://linux.die.net/man/1/join

答案 1 :(得分:2)

使用join(可能是最佳解决方案):

$ join -j2 <(sort -k2 test1.txt) <(sort -k2 test2.txt)
1234 PROCESS1 1.2.3.4
1234 PROCESS1 1.2.3.7
1234 PROCESS1 1.2.3.8
1234 PROCESS1 1.2.3.8
1234 PROCESS1 1.2.3.8
1235 PROCESS2 1.2.3.5
1235 PROCESS2 1.2.3.9
1236 PROCESS3 1.2.3.6

然后你可以试试像:

$ cat test.sh
#!/bin/bash

file1=test1.txt
file2=test2.txt

joinOutput=$(join -j2 <(sort -k2 "$file1") <(sort -k2 "$file2"))
countOutput=$(echo "$joinOutput"|awk '{key=$2" "$1" "$3; if(key in t){t[key]=t[key]+1} else {t[key]=1}} END {for (l in t){print l" "t[l]}}'|sort)
echo "$countOutput"
cat "$file1" <(echo "$countOutput")|cut -d " " -f2|sort|uniq -u|while read; do
    echo "$REPLY - 0"
done
$ ./test.sh
PROCESS1 1234 1.2.3.4 1
PROCESS1 1234 1.2.3.7 1
PROCESS1 1234 1.2.3.8 3
PROCESS2 1235 1.2.3.5 1
PROCESS2 1235 1.2.3.9 1
PROCESS3 1236 1.2.3.6 1
1237 - 0

否则,您可以尝试类似:

$ cat test.sh 
#!/bin/bash

file1=test1.txt
file2=test2.txt

joinOutput=$(
    while read c11 c12; do
        while read c21 c22; do
            [[ $c22 = $c12 ]] && echo "$c11 $c12 $c21"
        done < "$file2"
    done < "$file1"
)

countOutput=$(echo "$joinOutput"|awk '{if($0 in t){t[$0]=t[$0]+1} else {t[$0]=1}} END {for (l in t){print l" "t[l]}}'|sort)
echo "$countOutput"
cat "$file1" <(echo "$countOutput")|cut -d " " -f2|sort|uniq -u|while read; do
    echo "$REPLY - 0"
done
$ ./test.sh
PROCESS1 1234 1.2.3.4 1
PROCESS1 1234 1.2.3.7 1
PROCESS1 1234 1.2.3.8 3
PROCESS2 1235 1.2.3.5 1
PROCESS2 1235 1.2.3.9 1
PROCESS3 1236 1.2.3.6 1
1237 - 0