我有两个文件:
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中列出的时间
提前致谢
答案 0 :(得分:2)
尝试使用join
命令,让你做到这一点。
我能想到的唯一限制是必须对文件进行排序。因此,如果您不关心保留输出行的顺序,可以使用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