2014-09-17 6 views
1

У меня есть два файла tmp1.txt и tmp2.txt tmp1.txt имеетСравнить два файла в Баш

aaa.txt 
bbb.txt 
ccc.txt 
ddd.txt 

tmp2.txt имеет

/tmp/test1/aaa.txt 
/tmp/test1/aac.txt 
/tmp/test2/bbb.txt 
/tmp/test1/ccc.txt 

Я хочу, чтобы проверить, если файлы tmp1.txt существует в tmp2.txt и если он существует дисплей, который один он так показывает что-то похожее на этот

aaa.txt: test1 
bbb.txt: test2 
ccc.txt: test1 

Благодаря

ответ

3

Использование awk:

awk -F/ 'FNR==NR {a[$1];next} $NF in a {print $NF ": " $(NF-1)}' tmp1.txt tmp2.txt 
aaa.txt: test1 
bbb.txt: test2 
ccc.txt: test1 
+0

Это работает для примера ввода, но будет иметь проблемы, если пути в ' tmp1.txt' может иметь слэши (и вообще другие случаи, когда запись отличительного пути не является второй и последней). Но это только результат (потенциально) недоопределенной проблемы. –

+0

Да @EtanReisner: Предполагается, что 2-й файл делится на '/'. – anubhava

+0

Он принимает голое имя файла в 'tmp1.txt' и что пути в' tmp2.txt' являются формами '/ dont/care/about/this/bit/ВАЖНО/'. Это вполне разумно, учитывая данные выборки в OP. Я просто подумал, что стоит отметить. –

0

Если вы не хотите использовать AWK, есть немного Баш цикл:

while read f; do 
    isFound="$(grep /$f tmp2.txt 2>/dev/null)" 
    if [ ! -z "$isFound" ]; then 
    theDir=$(echo "$isFound"|cut -d'/' -f3) 
    echo "$f: $theDir" 
    fi 
done <tmp1.txt 
1

Bash Решение:

#!/bin/bash 
while read file && a=$(grep -Fw "$file" tmp2.txt) 
do 
    echo "$(basename $a): $(dirname $a)" 
done < tmp1.txt 
+1

Возможно, это '' '' '' '' '' '' '' '' '' '' '' '' ''. –

+0

@EtanReisner Спасибо, что указали это, я обновлю свой ответ – Ram

2

Я хотел бы предложить решение с использованием стандартных инструментови basename:

while read filename 
do 
    basename "$filename" 
done <tmp2.txt> tmp2.basenames.txt 
diff -u tmp1.txt tmp2.basenames.txt 

Основным преимуществом этого решения является его простота. Результат будет выглядеть немного по-другому, хотя, различия между файлами в tmp1.txt (-), tmp2.txt (+), или оба ():

--- tmp1.txt 2014-09-17 17:09:43.000000000 +0200 
+++ tmp2.basenames.txt 2014-09-17 17:13:12.000000000 +0200 
@@ -1,4 +1,4 @@ 
aaa.txt 
+aac.txt 
bbb.txt 
ccc.txt 
-ddd.txt 
Смежные вопросы