URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10155
[ Назад ]

Исходное сообщение
"Bash сравнить строки"

Отправлено lxs , 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?


Содержание

Сообщения в этом обсуждении
"Bash сравнить строки"
Отправлено Andrey Mitrofanov , 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"


"Bash сравнить строки"
Отправлено lxs , 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?


"Bash сравнить строки"
Отправлено Andrey Mitrofanov , 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?


"Bash сравнить строки"
Отправлено lxs , 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>

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



"Bash сравнить строки"
Отправлено _ , 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]]}

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


"Bash сравнить строки"
Отправлено DeadLoco , 07-Апр-17 11:49 
> как по номерам из file_1 вывести соответствующие этим номерам строки в file_2?

join file_1 file_2



"Bash сравнить строки"
Отправлено ACCA , 11-Апр-17 06:10 
>
join file_1 file_2

   join --nocheck-order file1 file2

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


"Bash сравнить строки"
Отправлено _ , 11-Апр-17 19:27 
>>
join file_1 file_2

>    join --nocheck-order file1 file2

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


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

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


"Bash сравнить строки"
Отправлено _ , 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

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


"Bash сравнить строки"
Отправлено ACCA , 12-Апр-17 20:50 
Пад*п засчитан.

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

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

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


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

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



"Bash сравнить строки"
Отправлено михалыч , 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"};}'


"Bash сравнить строки"
Отправлено ACCA , 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 строк, то ты конкретно попал.


"Bash сравнить строки"
Отправлено universite , 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 строк, то ты конкретно попал.

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