比较两个不同文件中的字符串并返回常用文件

时间:2014-11-07 21:07:38

标签: shell unix ksh

使用ksh脚本尝试比较我得到的两个文件。我尝试过使用comm,diff和grep,但无法得到我想要的结果。我可以在下面显示我想要做的事情。

此时就把one.txt存盘

name1
name2

two.txt

name1|email1
name2|email2
name3|email3

我尝试过使用grep -f但是我的机器上有非法选项,所以我正在寻找不同的东西。无论如何我可以查看文件中的一个并查看这些字符串,然后查看文件二并查看匹配的字符串并从two.txt中取出第二个值,这样看起来像这样吗?

three.txt

email1
email2

感谢帮助

3 个答案:

答案 0 :(得分:1)

for entry in $(cat one.txt)
do 
    grep $entry two.txt| awk -F"|" '{print $NF}' 
done > three.txt

答案 1 :(得分:1)

join看起来像是一份工作。如果文件已经排序(如示例数据中所示):

join -t '|' -o 2.2 one.txt two.txt

如果文件尚未排序,并且您的Bash或Korn shell包含process substitution

join -t '|' -o 2.2 <(sort one.txt) <(sort two.txt)

如果您没有使用流程替换的Bash或Korn shell:

tmp=$(mktemp ${TMPDIR:-/tmp}/j.XXXXXX)
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15

sort one.txt > $tmp.1
sort two.txt > $tmp.2
join -t '|' -o 2.2 $tmp.1 $tmp.2

rm -f $tmp.?
trap 0

(你可以使用一个临时文件,但这是对称的,这使得它更加清晰。)

答案 2 :(得分:0)

试试这个:

$ cat one.txt
name1
name2
$ cat two.txt
name1|email1
name2|email2
name3|email3
$ cat filter.ksh
#! /usr/bin/ksh
for LINE in $(cat one.txt); do
  sed -n "s/$LINE|//p" two.txt
done
$ ./filter.ksh
email1
email2