Здравствуйте! Ломаю голову над задачей:есть 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?
> Здравствуйте! Ломаю голову над задачей:
> есть 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:> #!/bin/bash
> gawk '
> ARGIND==1{ a[++nn]=$0; b[$1]=$1}
> ARGIND==2{ print a[ b[ $0]]}
> ' "$2" "$1"Я в этом деле совсем зелёный. Извините, не понял, куда в предложенном скрипте подставить file_1 и file_2?
$ 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?
> $ 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>Отправляют в командировку, по возврату попробую на серваке. Спасибо!
> #!/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]]}
А вообще - красиво, молодца! :)
> как по номерам из file_1 вывести соответствующие этим номерам строки в file_2?
join file_1 file_2
>join file_1 file_2join --nocheck-order file1 file2
А то заи*т жаловаться.
>>join file_1 file_2
> join --nocheck-order file1 file2К примеру вот этого:
120 120 ftp://10.10.10.6:21
не видит :(
А подрихтованный Андрейкин скрипт - видит.
Понимаю умом что где то недр-пере-с-подвыподветел %-) Но чё ему надо так и не фффтыкнул.
PS: сортировать ввод пробовал, всё одно - глючит.
> 120
> 120 ftp://10.10.10.6:21
> не видит :(
> А подрихтованный Андрейкин скрипт - видит.
> Понимаю умом что где то недр-пере-с-подвыподветел %-) Но чё ему надо так
> и не фффтыкнул.
> PS: сортировать ввод пробовал, всё одно - глючит.После 120 в первом файле есть \n ?
> После 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И вот чего ему натЪ?! "... аж кющить не магу" (С) :-)
Пад*п засчитан.Действительно - join не понимает результат `sort -n' (это то, что в исходных файлах было).
Чтобы заработало, man join, там в конце есть пример - sort -1b 1 или join -t ''
Короче, нужно пересортировать оба файла в алфавитном порядке.
> Короче, нужно пересортировать оба файла в алфавитном порядке.Вот нутром же чувствовал - пол-литра! :)
Ну комрады - пока ещё люди умнее компов, у нас тут выходной поеду праздновать победу хуманов! :)
> как по номерам из file_1 вывести соответствующие этим номерам строки в file_2?я тоже участвую, лучше поздно, чем никогда ))
perl -e 'open(F1,file1);@s{<F1>}=();open(F2,file2);while(<F2>){/^(\d+)\s.*$/;print if exists $s{"$1\n"};}'
> perl -e 'open(F1,file1);@s{<F1>}=();open(F2,file2);while(<F2>){/^(\d+)\s.*$/;print
> if exists $s{"$1\n"};}'Таки да, можно даже файлы не сортировать. Правда, если в file1 окажется 18446744073709551615 строк, то ты конкретно попал.
>> perl -e 'open(F1,file1);@s{<F1>}=();open(F2,file2);while(<F2>){/^(\d+)\s.*$/;print
>> if exists $s{"$1\n"};}'
> Таки да, можно даже файлы не сортировать. Правда, если в file1 окажется
> 18446744073709551615 строк, то ты конкретно попал.Имхо, ОЗУ быстрее закончится :)