Сравнение двух файлов с использованием скрипта bash - PullRequest
1 голос
/ 14 ноября 2010

Мне нужен скрипт для редактирования файлов.Я уже немного схожу с ума по этому поводу:).

У меня есть два файла:

143956;lorem 
143957;ipsum
143958;lala
143959;vuvu

и второй

512;143956;15
2156;143957;15
153;143958;4968
2156;143959;486

И что мне нужно, так этосоедините эти два файла таким образом:

512;143956;lorem;15
2156;143957;ipsum;15
153;143958;lala;4968
2156;143959;vuvu;486

Это не выглядит так сложно, и, вероятно, paste будет достаточно, но есть подвох.Есть строки, которые находятся только в одном из этих файлов, но отсутствуют в другом.В таком случае мне нужно подождать в строке второго файла и все равно сравнивать с первым.

Пример:

143956;lorem 
143957;ipsum
143959;vuvu //here "lulu" is missing, will compare with 3rd line (143958) but the script wont declare this as "not found" but keep on searching till finds 143959 (which is already on 4 in this case).

 512;143956;15 
 2156;143957;15  
 153;143958;4968
 2156;143959;486

Вывод будет выглядеть так:

512;143956;lorem;15
2156;143957;ipsum;15
2156;143959;vuvu;486

Или лучше так

512;143956;lorem;15
2156;143957;ipsum;15
153;143958;*WAS NOT FOUND*;4968
2156;143959;vuvu;486

Но я могузакончить это самостоятельно ...

Надеюсь, это понятно.Большое спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

Использование процесса подстановки Bash (<()) и утилиты join:

join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2)

Или вы можете предварительно отсортировать файлы.

Для выводазаписи, которые появляются в файле2, но не появляются в файле1:

join -t \; -1 1 -2 2 -v 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2) | sed 's/;;/;*WAS NOT FOUND*;/'
1 голос
/ 14 ноября 2010

Если первый файл не слишком большой, вы можете сделать (test1 и test2 - два файла в указанном вами порядке):

#!/bin/sh

for line in `cat test2`; do
  number=`echo "$line" | grep -o ";[0-9]*;" | sed 's/;//g'`
  repl=`grep "$number;" test1`
  if [ -z "$repl" ]; then
    echo "$line" | sed "s#;$number;#;$number;*WAS NOT FOUND*;#g"
  else
    echo "$line" | sed "s#;$number;#;$repl;#g"
  fi  
done
...