The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

форумы  правила/FAQ  поиск  регистрация  вход/выход  слежка  RSS
"Bash сравнить строки"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Bash сравнить строки"  +/
Сообщение от lxs (ok) on 06-Апр-17, 18:15 
Здравствуйте! Ломаю голову над задачей:

есть file_1:              и file_2:
7                       1  ftp://127.0.0.32:21
8                       2  ftp://10.0.0.5:21
11                     3  ftp://10.10.1.1:21
16                     4  ftp://10.201.1.2:21
18                     5  ftp://127.1.1.4:21
20                     6  ftp://191.168.1.35:21
24                     7  ftp://192.168.1.24:21
27                     8  ftp://10.10.1.4:21
29                     9  ftp://10.10.1.7:21
32                     10 ftp://192.168.1.39:21
...                                  ...
...                                  ...
120                    120 ftp://10.10.10.6:21
как по номерам из file_1 вывести соответствующие этим номерам строки в file_2?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "Bash сравнить строки"  +/
Сообщение от Andrey Mitrofanov on 06-Апр-17, 18:39 
> Здравствуйте! Ломаю голову над задачей:
> есть file_1:          
>    и file_2:

#!/bin/bash
gawk '
ARGIND==1{ a[++nn]=$0; b[$1]=$1}
ARGIND==2{ print a[ b[ $0]]}
' "$2" "$1"

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Bash сравнить строки"  +/
Сообщение от lxs (ok) on 07-Апр-17, 03:28 
Здравствуйте! Ломаю голову над задачей:
есть file_1:
    и file_2:

> #!/bin/bash
> gawk '
> ARGIND==1{ a[++nn]=$0; b[$1]=$1}
> ARGIND==2{ print a[ b[ $0]]}
> ' "$2" "$1"

Я в этом деле совсем зелёный. Извините, не понял, куда в предложенном скрипте подставить file_1 и file_2?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Bash сравнить строки"  +/
Сообщение от Andrey Mitrofanov on 07-Апр-17, 09:58 
$ cat <<EOE >script.bash
>> #!/bin/bash
>> gawk '
>> ARGIND==1{ a[++nn]=$0; b[$1]=$1}
>> ARGIND==2{ print a[ b[ $0]]}
>> ' "$2" "$1"

EOE
$ chmod +x script.bash
$ ./script.bash file_1 file_2 <ENTER>

> Я в этом деле совсем зелёный. Извините, не понял, куда в предложенном
> скрипте подставить file_1 и file_2?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Bash сравнить строки"  +/
Сообщение от DeadLoco (ok) on 07-Апр-17, 11:49 
> как по номерам из file_1 вывести соответствующие этим номерам строки в file_2?

join file_1 file_2


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Bash сравнить строки"  +/
Сообщение от lxs (ok) on 07-Апр-17, 18:16 
> $ cat <<EOE >script.bash
>>> #!/bin/bash
>>> gawk '
>>> ARGIND==1{ a[++nn]=$0; b[$1]=$1}
>>> ARGIND==2{ print a[ b[ $0]]}
>>> ' "$2" "$1"
> EOE
> $ chmod +x script.bash
> $ ./script.bash file_1 file_2 <ENTER>

Отправляют в командировку, по возврату попробую на серваке. Спасибо!


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Bash сравнить строки"  +/
Сообщение от ACCA (ok) on 11-Апр-17, 06:10 
>
join file_1 file_2

   join --nocheck-order file1 file2

А то заи*т жаловаться.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Bash сравнить строки"  +/
Сообщение от _ (??) on 11-Апр-17, 19:15 
> #!/bin/bash
> gawk '
> ARGIND==1{ a[++nn]=$0; b[$1]=$1}
> ARGIND==2{ print a[ b[ $0]]}
> ' "$2" "$1"

Нашёл ошибку:
> ARGIND==1{ a[++nn]=$0; b[$1]=$1}

< ARGIND==1{ a[++nn]=$0; b[$1]=nn}
Ну и по-эстэтствовать:
> ARGIND==2{ print a[ b[ $0]]}

< ARGIND==2{ if (b[$0]) print a[ b[ $0]]}

А вообще - красиво, молодца! :)

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

8. "Bash сравнить строки"  +/
Сообщение от _ (??) on 11-Апр-17, 19:27 
>>
join file_1 file_2

>    join --nocheck-order file1 file2

К примеру вот этого:
120                    120 ftp://10.10.10.6:21
не видит :(
А подрихтованный Андрейкин скрипт - видит.
Понимаю умом что где то недр-пере-с-подвыподветел %-) Но чё ему надо так и не фффтыкнул.
PS: сортировать ввод пробовал, всё одно - глючит.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "Bash сравнить строки"  +/
Сообщение от ACCA (ok) on 11-Апр-17, 21:27 
> 120            
>         120 ftp://10.10.10.6:21
> не видит :(
> А подрихтованный Андрейкин скрипт - видит.
> Понимаю умом что где то недр-пере-с-подвыподветел %-) Но чё ему надо так
> и не фффтыкнул.
> PS: сортировать ввод пробовал, всё одно - глючит.

После 120 в первом файле есть \n ?

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Bash сравнить строки"  +/
Сообщение от михалыч (ok) on 12-Апр-17, 07:43 
> как по номерам из file_1 вывести соответствующие этим номерам строки в file_2?

я тоже участвую, лучше поздно, чем никогда ))
perl -e 'open(F1,file1);@s{<F1>}=();open(F2,file2);while(<F2>){/^(\d+)\s.*$/;print if exists $s{"$1\n"};}'

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

11. "Bash сравнить строки"  +/
Сообщение от _ (??) on 12-Апр-17, 18:04 
> После 120 в первом файле есть \n ?

Не - ну стандартные приколы я сразу проверил  :-)
$ hd -c file_1
00000000  37 0a 38 0a 31 31 0a 31  36 0a 31 38 0a 32 30 0a  |7.8.11.16.18.20.|
0000000   7  \n   8  \n   1   1  \n   1   6  \n   1   8  \n   2   0  \n
00000010  32 34 0a 32 37 0a 32 39  0a 33 32 0a 2e 2e 2e 0a  |24.27.29.32.....|
0000010   2   4  \n   2   7  \n   2   9  \n   3   2  \n   .   .   .  \n
00000020  2e 2e 2e 0a 31 32 30 0a                           |....120.|
0000020   .   .   .  \n   1   2   0  \n
0000028

И вот чего ему натЪ?! "... аж кющить не магу" (С)  :-)

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12. "Bash сравнить строки"  +/
Сообщение от ACCA (ok) on 12-Апр-17, 20:50 
Пад*п засчитан.

Действительно - join не понимает результат `sort -n' (это то, что в исходных файлах было).

Чтобы заработало, man join, там в конце есть пример - sort -1b 1 или join -t ''

Короче, нужно пересортировать оба файла в алфавитном порядке.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Bash сравнить строки"  +/
Сообщение от ACCA (ok) on 12-Апр-17, 20:54 
> perl -e 'open(F1,file1);@s{<F1>}=();open(F2,file2);while(<F2>){/^(\d+)\s.*$/;print
> if exists $s{"$1\n"};}'

Таки да, можно даже файлы не сортировать. Правда, если в file1 окажется 18446744073709551615 строк, то ты конкретно попал.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

14. "Bash сравнить строки"  +/
Сообщение от . on 14-Апр-17, 06:14 
> Короче, нужно пересортировать оба файла в алфавитном порядке.

Вот нутром же чувствовал - пол-литра! :)
Ну комрады - пока ещё люди умнее компов, у нас тут выходной поеду праздновать победу хуманов! :)


Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

15. "Bash сравнить строки"  +/
Сообщение от universite (ok) on 08-Июн-17, 19:29 
>> perl -e 'open(F1,file1);@s{<F1>}=();open(F2,file2);while(<F2>){/^(\d+)\s.*$/;print
>> if exists $s{"$1\n"};}'
> Таки да, можно даже файлы не сортировать. Правда, если в file1 окажется
> 18446744073709551615 строк, то ты конкретно попал.

Имхо, ОЗУ быстрее закончится :)

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor