Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Сравнение 2 - х файлов с помощью shell,awk,sed...  (Прочитано 5677 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Добрый день!
Не подскажите, есть вот такой вопрос - есть 2 файла:
Файл a:
111
333
888
В нем коды сообщений, выборочно.
Файл b:
111 "Текст 1"
222 "Текст 2"
333 "Текст 3"
...
7777 "Тест 7777"
Коды и текст по-порядку.
Как сделать так чтобы коды в 1 файле после сравнения со вторым превращались в соответственный текст.
Хотел такой конструкцией воспользоваться, но не прокатило:
for i in `cat a`
do
awk ' /$i/ { print $2 } ' b
done

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #1 : 18 Декабря 2012, 12:11:55 »
Код: (bash) [Выделить]
$ head 1.txt 2.txt
==> 1.txt <==
111
333
888

==> 2.txt <==
111 "Текст 1"
222 "Текст 2"
333 "Текст 3"
...
7777 "Тест 7777"

$ cat 1.txt | while read ; do awk -F'^[[:digit:]]* ' "/$REPLY/{print \$2}" 2.txt ; done
"Текст 1"
"Текст 3"

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #2 : 18 Декабря 2012, 12:36:45 »
root@spbmas1> head 1.txt 2.txt
==> 1.txt <==
111
333
888
==> 2.txt <==
111 ADB
222 BSS
333 SFf
444 xdfgdfg
555 fsdf
666 dfgdfg
777 dfgddg
888 dfgdfgdfgroot@spbmas1> cat 1.txt | while read ; do awk -F'^[[:digit:]]* ' "/$REPLY/{print \$2}" 2.txt ; done

CORRECT>cat 1.txt | while read ; do awk -F'^[[:digit:]]* ' "/$REPLY/{print \$2}" 2.txt ; done (y|n|e|a)? no
while: Expression Syntax.
 Похоже ошибка в синтаксисе

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #3 : 18 Декабря 2012, 14:25:37 »
Добавьте EOL перед EOF в 2.txt.
Проверьте:
echo $BASH_VERSION
namei $SHELL

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #4 : 18 Декабря 2012, 16:05:44 »
спасибо)

Пользователь решил продолжить мысль 19 Декабря 2012, 11:46:27:
На самом деле скрипт делаю в солярке:
#! /bin/ksh
#set -x -v -C

# Sravneniye script  by Nikolay P.

cat 1.txt | while read
do
awk -F'^[[:digit:]]*' "/$REPLY/{print \$2}" 2.txt ;

done

exit

Ответ вот такой:
root@spbxts4> ./sravnenie_strochek.skr


root@spbxts4>
Тоесть никакой.. подскажите в чем может быть все-таки проблема. От интерпретатора я думаю не зависит в данном случае
« Последнее редактирование: 19 Декабря 2012, 11:46:27 от Juve_Nic »

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #5 : 20 Декабря 2012, 14:07:05 »
есть идеи как сделать?

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #6 : 20 Декабря 2012, 14:50:24 »
У Вас спросили про версии баша и название шела, а Вы упорно молчите.
А по делу.
В разных шелах свои особенности и требуется легкая подгонка под свой шел.
Например, может быть надо заменить дефолтную переменную $REPLY, на определенную внутри скрипта.

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #7 : 20 Декабря 2012, 16:31:21 »
Korn Shell и Bash соответственно версии  3.00.16(1)-release , в переменных среды нет $REPLY

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #8 : 20 Декабря 2012, 17:05:20 »
В некоторых шелах для построчного ввода по умолчанию (если ничего не указано), используется $REPLY.
В других, например в bash, это не работает (я с этим сталкивался). Чтобы было понятно привожу пример.

Конструкцию типа
while read
do
echo $REPLY
done
меняем на
while read LINE
do
echo $LINE
done
и все работает.
ЗЫ.
Сейчас проверил у себя. Оба варианта работают.
cat v.conf | while read LINE;do echo $LINE;done
и
cat v.conf | while read;do echo $REPLY;done
Ведут себя одинаково и правильно.
echo $BASH_VERSION
4.1.5(1)-release
« Последнее редактирование: 20 Декабря 2012, 17:19:18 от alexander.pronin »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #9 : 20 Декабря 2012, 18:58:54 »
$ echo $BASH_VERSION
4.2.39(1)-release

$ namei $SHELL
f: /bin/bash
 d /
 l bin -> usr/bin
   d usr
   d bin
 - bash

$ shopt
autocd          off
cdable_vars    off
cdspell        off
checkhash      off
checkjobs      off
checkwinsize    on
cmdhist        on
compat31        off
compat32        off
compat40        off
compat41        off
direxpand      off
dirspell        off
dotglob        off
execfail        off
expand_aliases on
extdebug        off
extglob        on
extquote        on
failglob        off
force_fignore  on
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    off
huponexit      off
interactive_comments on
lastpipe        off
lithist        off
login_shell    off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch    off
nullglob        off
progcomp        on
promptvars      on
restricted_shell off
shift_verbose  off
sourcepath      on
xpg_echo        off
Всё работает.

PS
В убyнтах всяких вместо bash м.б. симлинк на dash, поэтому у людей иногда вылазят косяки.
« Последнее редактирование: 20 Декабря 2012, 19:00:44 от arcfi »

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #10 : 20 Декабря 2012, 20:24:32 »
на самом деле это сравнение мне нужно не в linux debian ветки, а в Solaris. Поэтому возможно и нет переменной $REPLY. В любом случае спасибо за участие...

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #11 : 20 Декабря 2012, 20:33:00 »
Поэтому возможно и нет переменной $REPLY.
Дык, задайте явно:
cat v.conf | while read LINE;do echo $LINE;done

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #12 : 20 Декабря 2012, 20:47:03 »
а затем, подставить соответственно конструкцию написанную вами выше...
cat 1.txt | while read ; do awk -F'^[[:digit:]]* ' "/$LINE/{print \$2}" 2.txt ; done ?

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #13 : 20 Декабря 2012, 20:56:00 »
Код: (bash) [Выделить]
cat 1.txt | while read LINE ; do awk -F'^[[:digit:]]* ' "/$LINE/{print \$2}" 2.txt ; done

Оффлайн Juve_Nic

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Сравнение 2 - х файлов с помощью shell,awk,sed...
« Ответ #14 : 20 Декабря 2012, 20:58:21 »
arcfi,спасибо большое, завтра попробую.

Пользователь решил продолжить мысль 21 Декабря 2012, 09:53:18:
Значит с LINE все работает если просто задавать переменную:
nvprokop@spbxts4> head 1.txt 2.txt
==> 1.txt <==
111
333
888
==> 2.txt <==
111 ADB
222 BSS
333 SFf
444 xdfgdfg
555 fsdf
666 dfgdfg
777 dfgddg
888 dfgdfgdfgnvprokop@spbxts4> cat sravnenie_strochek.skr
#! /bin/ksh
#set -x -v -C


cat 1.txt | while read LINE;do echo $LINE;done


exitnvprokop@spbxts4> ./sravnenie_strochek.skr
111
333
nvprokop@spbxts4>

Но если выполнять с конструкцией awk, не фильтрует 2-ой файл:
nvprokop@spbxts4> head 1.txt 2.txt
==> 1.txt <==
111
333
888
==> 2.txt <==
111 ADB
222 BSS
333 SFf
444 xdfgdfg
555 fsdf
666 dfgdfg
777 dfgddg
888 dfgdfgdfg
nvprokop@spbxts4> cat sravnenie_strochek.skr
#! /bin/ksh
#set -x -v -C


cat 1.txt | while read LINE ; do awk -F'^[[:digit:]]* ' "/$LINE/{print \$2}" 2.txt ; done

exitnvprokop@spbxts4> ./sravnenie_strochek.skr



Пользователь решил продолжить мысль 21 Декабря 2012, 10:50:13:
более того и не работает с такой конструкцией внутри:

cat 1.txt | while read LINE
do
sed -n '/$LINE/p' 2.txt
done

Вывод так же пустой
« Последнее редактирование: 21 Декабря 2012, 10:50:13 от Juve_Nic »

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.