На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
alienrom
Сообщения: 142
ОС: GNU/Linux, BSD
Сообщение
alienrom » 01.11.2012 14:23
Доброго всем времени.
Возникла тут задача, решить которую не могу уже целый час
Нужно из одного файла строки с четвёртой с начала и до четвёртой с конца вставить в другой файл в туже позицию, заменив существующие.
Например. есть 2 файла: file1 и file2
Код: Выделить всё
file1: file2:
строка1 string1
строка2 string2
строка3 string3
строка4 string4
строка5 string5
строка6 string6
строка7 string7
строка8 string8
строка9 string9
После манипуляций, второй файл должен принять вид:
Код: Выделить всё
string1
string2
string3
строка4
строка5
строка6
string7
string8
string9
Вертел-крутил седом. Но так и не дошел до решения. Как поступить?
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 01.11.2012 14:47
Код: Выделить всё
{ head -n 3 file2 ; sed '1,3d' file1 | head -n -3 ; tail -n 3 file2 ; } > new_file
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Bizdelnick
Модератор
Сообщения: 21257
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 01.11.2012 16:39
SLEDopit писал(а): ↑ 01.11.2012 14:47
Код: Выделить всё
{ head -n 3 file2 ; sed '1,3d' file1 | head -n -3 ; tail -n 3 file2 ; } > new_file
Тогда уж вообще без sed:
Код: Выделить всё
{ head -n 3 file2 ; tail -n +4 file1 | head -n -3 ; tail -n 3 file2 ; } > new_file
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 05.11.2012 23:50
alienrom писал(а): ↑ 01.11.2012 14:23
Нужно из одного файла строки с четвёртой с начала и до четвёртой с конца вставить в другой файл в туже позицию, заменив существующие.
понятие "четвёртая с конца" в sed не имеет смысла.
можно узнать её как
Это длинна файла
1 минус 3.
Потом можно слить два файла
$
$ paste 1 2
11 21
12 22
13 23
14 24
15 25
16 26
17 27
18 28
19 29
$ sed 'R2' 1
11
21
12
22
13
23
14
24
15
25
16
26
17
27
18
28
19
29
ну и наконец сделать требуемое
Shell
$ sed 'R2' 1 | sed 'N;8,12s/\n.*//;t;s/.*\n//
21
22
23
14
15
16
27
28
29
8 это 4*2, а 12 это (9-(4-1))*2, где 9 это размер файла.
ЗЫЖ магия быть может, но работает...
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 05.11.2012 23:59
drBatty писал(а): ↑ 05.11.2012 23:50
понятие "четвёртая с конца" в sed не имеет смысла.
Тем не менее, даже это можно вычислить в автоматическом режиме, при желании. Хотя sed не очень подходит для этой задачи.
drBatty писал(а): ↑ 05.11.2012 23:50
ЗЫЖ магия быть может, но работает...
Да какая уж тут магия. Всё просто и понятно (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
alienrom
Сообщения: 142
ОС: GNU/Linux, BSD
Сообщение
alienrom » 13.11.2012 15:49
О.. всем спасибо за советы.)
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 15.11.2012 10:48
SLEDopit писал(а): ↑ 05.11.2012 23:59
Тем не менее, даже это можно вычислить в автоматическом режиме, при желании. Хотя sed не очень подходит для этой задачи.
угу.
Код: Выделить всё
sed -rn 'H;${g;s/.*\n([^\n]+)(\n[^\n]*){3}$/\1/p}'
вот только tail читает файл с конца, а sed с начала. Потому sed будет читать ВЕСЬ файл.