Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用shell脚本从两个列表中提取数据_Linux_Bash_Shell - Fatal编程技术网

Linux 使用shell脚本从两个列表中提取数据

Linux 使用shell脚本从两个列表中提取数据,linux,bash,shell,Linux,Bash,Shell,我正在尝试创建一个shell脚本,它从一个文件中提取一行,并检查另一个文件中是否有相同的实例。如果它找到一个条目,那么它会将其添加到另一个文件中,并在第一个列表中循环,直到它遍历了整个文件。第一个文件中的数据如下所示- email@address.com; email2@address.com; and so on 12334 email@address.com; 32213 email2@address.com; 另一个文件,我正在寻找一个匹配,并将匹配放在空白文件中,看

我正在尝试创建一个shell脚本,它从一个文件中提取一行,并检查另一个文件中是否有相同的实例。如果它找到一个条目,那么它会将其添加到另一个文件中,并在第一个列表中循环,直到它遍历了整个文件。第一个文件中的数据如下所示-

email@address.com;
email2@address.com;
and so on   
12334    email@address.com;
32213    email2@address.com;

另一个文件,我正在寻找一个匹配,并将匹配放在空白文件中,看起来是这样的:

email@address.com;
email2@address.com;
and so on   
12334    email@address.com;
32213    email2@address.com;
我希望它保留数字以及匹配的数据。我有一个想法,这应该如何工作,但需要知道如何实施它

我的想法 我希望输出像这样,但只针对匹配的地址-

12334 email@address.com;
32213 email2@address.com;

谢谢

在您学习了
diff
comm
之后,现在是学习unix工具箱中另一个工具的时候了,
join

Join只执行名称所指示的操作,它将两个文件连接在一起。加入的方式基于文件中嵌入的键

使用join的第一个限制是数据必须在同一列的两个文件中进行排序

file1
a abc
b bcd
c cde

file2
a rec1
b rec2
c rec3


join file1 file2
a abc rec1
b bcd rec2
c cde rec3
您可以查阅join手册页,了解如何减少和重新排列输出列。比如说

1>join -o 1.1 2.2 file1 file2
a rec1
b rec2
c rec3
您可以使用文件名输入代码将其转换为可概括的脚本

在for循环中使用管道的解决方案适用于小数据集,但随着数据量的增长,为搜索的每个单词启动新进程的成本将降低运行时间


我希望这会有所帮助。

就像使用SQL操作文本一样:

$ cat file1
b@address.com
a@address.com
c@address.com
d@address.com
$ cat file2
10712 e@address.com
11457 b@address.com
19985 f@address.com
22519 d@address.com
$ join -1 1 -2 2 <(sort file1) <(sort -k2 file2) | awk '{print $2,$1}'
11457 b@address.com
22519 d@address.com
$cat文件1
b@address.com
a@address.com
c@address.com
d@address.com
$cat文件2
10712e@address.com
11457b@address.com
19985f@address.com
22519d@address.com

$join-11-22此
awk
一行代码可以帮助您做到这一点-

awk 'NR==FNR{a[$1]++;next}($2 in a){print $0 > "f3.txt"}' f1.txt f2.txt
NR
FNR
是存储行号的
awk的内置变量<使用两个文件时,代码>NR
不会重置为0<代码>FNR
执行。因此,当该条件为真时,我们将所有内容添加到数组
a
。一旦
第一个文件
完成,我们将检查
第二个文件
第二列
。如果
数组中存在匹配项
我们将整行放入文件
f3.txt
。如果没有,我们就忽略它

使用Kev解决方案中的数据:
通过file1.txt文件读取该行,并将该行分配给var ADDR。grep file2.txt,包含var ADDR的内容,并将输出附加到文件_result.txt

(while read ADDR; do grep "${ADDR}" file2.txt >> file_result.txt ) < file1.txt
(读取ADDR时;执行grep“${ADDR}”file2.txt>>文件\u result.txt)