LINUX.ORG.RU

Объеденение файлов ...


0

0

Есть 2 файла:

1 файл:

A B

A B

C D

C D

2 файл:

B R

D F

Нужно чтобы получился файл:

A R

A R

C F

C F

т е нужно их объединить ... Можно ли это сделать средствами bash, awk, sed и тп, не прибегая к более "продвинутым" скриптовым языкам ?

anonymous

Это текстовые файлы?

Это конкретная или теоретическая задача?

cat 1 2 n > x // объединит n файлов в файл x

unonimous
()
Ответ на: комментарий от unonimous

как только что-нибудь поадминишь _практически_ - сразу поймешь. без обид, это правда.

sasha999 ★★★★
()
Ответ на: комментарий от unonimous

> Точно не просек, зачем такое нужно практически?

обработка графов на шелле

на самом деле реально встречается потребность в join; большинство утилит заточены на построчную обработку, а join -- это тот ключ который применяется для того чтобы выйти за построчные рамки..

dilmah ★★★★★
()
Ответ на: комментарий от sasha999

Нда это оно - только не пойму как туда в качестве разделителя засунуть табуляцию - по дефоулту там пробел. \t не помогает - т е нужно одним символом ?

anonymous
()
Ответ на: комментарий от sdio

там в инпуте по дефолту whitespace. На аутпут пробел. Но можно его превратить в таб например так: join blah-blah-blah | tr ' ' \\t

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Да как раз вот этот пробел на выходе и портит дело ( там пробелы в полях встречаются ) прийдется как-то извращаться - хотя это криво конечно ...

anonymous
()
Ответ на: комментарий от anonymous

Хотя и опция -o делит по пробелу ... Прийдется еще и cut натравливать ?

anonymous
()
Ответ на: комментарий от anonymous

Что-то, где-то вы врете

Если в исходных полях есть пробелы, а сами поля разделены символом CHAR,
то с командой join ты используешь опцию "-t CHAR", так?

И снова man join         :-)

-t CHAR     use CHAR as input and output field separator
                                  ^^^^^^

sdio ★★★★★
()
Ответ на: комментарий от sdio

>>>-t CHAR use CHAR as input and output field separator

Если ничего не ставить - input символ - это табуляция, output символ - это пробел. Если поставить этот самый CHAR например в пробел - то пробел появляется везде ( и input и output ). Остался вопрос как одним символом CHAR обозначить табуляцию ?

anonymous
()
Ответ на: комментарий от anonymous

Во входных файлах заменить ТАБ на уникальный символ --> join --> обратно уникальный символ заменить на ТАБ

sdio ★★★★★
()
Ответ на: комментарий от sdio

Да это понятно но просто костыль - не могли сделать по дефоулту например везде табуляцию ...

anonymous
()
Ответ на: комментарий от anonymous

>Если ничего не ставить - input символ - это табуляция, output символ - это пробел.

Да откуда ты это взял? output -- пробел. Но input не табуляция, а whitespace


строки с пробелами в полях, разделитель <таб>
A A  <tab> B B

$ cat 1.txt | od -c -v -w8
0000000   A       A  \t   B       B  \n
0000010   A       A  \t   B       B  \n
0000020   C       C  \t   D       D  \n
0000030   C       C  \t   D       D  \n

$ cat 2.txt | od -c -v -w8
0000000   B       B  \t   R       R  \n
0000010   D       D  \t   F       F  \n

$ join -1 2 -2 1 -o 1.1,2.2 1.txt 2.txt
$

sdio ★★★★★
()
Ответ на: комментарий от sdio

>>> Но input не табуляция, а whitespace

по словарю: 1) комп. пробелы, символы табуляции и пустой строки

Кстати насчет табуляции:

tab=`printf "\t"`

join -t "$tab" -j 1 ./file1 ./file2 - вот так работает ...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.