Сравнение строк в двух разных файлах и возврат общих

Используя сценарий ksh, я попробую сравнить два полученных мной файла. Я пробовал использовать comm, diff и grep, но не могу получить желаемых результатов. Ниже я могу показать, что я пытаюсь сделать.

one.txt

name1
name2

two.txt

name1|email1
name2|email2
name3|email3

Я пробовал использовать grep -f, но у меня есть недопустимая опция на моем компьютере, поэтому я ищу что-то другое. Могу ли я в любом случае заглянуть в первый файл и увидеть эти строки, затем посмотреть во второй файл и увидеть соответствующие строки и вытащить второе значение из two.txt, чтобы оно выглядело так?

three.txt

email1
email2

Цените помощь


person ClaytunBigsby    schedule 07.11.2014    source источник


Ответы (2)


Похоже, это работа для join. Если файлы уже отсортированы (как в примере данных):

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

Если файлы еще не отсортированы и у вас есть оболочка Bash или Korn с подмена процесса:

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

Если у вас нет оболочки Bash или Korn с заменой процесса:

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

(Вы можете использовать один временный файл, но он симметричный, что позволяет лучше понять, что происходит.)

person Jonathan Leffler    schedule 07.11.2014

Попробуй это:

$ 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
person ceving    schedule 07.11.2014