Страницы

Поиск по вопросам

Показаны сообщения с ярлыком объединение. Показать все сообщения
Показаны сообщения с ярлыком объединение. Показать все сообщения

воскресенье, 15 марта 2020 г.

Как объединить 60000 файлов в один файл?

#bash #unix #объединение


В директории есть порядка 60000 текстовых файлов, их надо объединить в один файл.

Команда:

cat * > all.txt


не срабатывает:

-bash: /bin/cat: Argument list too long


Попробовал через:

find ./ -name '*.txt' | xargs grep '' > ../all.txt


но столкнулся с тем, что в all.txt записывается и путь, и название файла:

.//file1.txt:row1
.//file1.txt:row2
...


Какие еще могут быть варианты?
    


Ответы

Ответ 1



touch ../all.txt find ./ -name "*.txt" | xargs cat >> ../all.txt То есть cat каждого файла по отдельности, а не сразу всех в одной команде cat.

Ответ 2



воспроизводим ситуацию (у меня получилось с чуть большим количеством файлов): $ for i in $(seq 1 600000); do echo $i > $i.txt; done $ ls | wc -l 600000 $ cat *.txt > spisok bash: /bin/cat: Argument list too long будем добавлять содержимое в файл, который не подпадает под маску *.txt — это полезное условие, которое помогает избежать некоторых неприятностей. очень быстро и наиболее оптимально, вероятно, сделать примерно так (wc -l файл — это подсчёт количества строк в файле): $ find -name \*.txt -exec cat {} > spisok + $ wc -l spisok 600000 spisok $ head -n 3 spisok 200784 59591 584250 хм. файлы читались явно не по алфавитном порядку. если так не пойдёт, то придётся применить менее оптимальное решение с сортировкой и командой xargs: $ find -name \*.txt | sort | xargs -I{} cat {} > spisok $ wc -l spisok 600000 spisok $ head -n 3 spisok 100000 100001 100002 теперь файлы читаются (и записываются) по (алфавитному) порядку.

среда, 5 февраля 2020 г.

Как объединить два списка/кортежа словарей (например списки записей БД) в Python

#python #python_3x #python_2x #словари #объединение


Имеется два списка словаря:

Первый:

x = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Непродана]'},{'title':'[нисан]',
'prise':'[70000]', 'status':'[Непродана]'}


Второй:

y = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[БМВ]',
'prise':'[70000]', 'status':'[Непродана]'}


Желаемый результат:

 z = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[нисан]',
'prise':'[70000]', 'status':'[Непродана]'}, {'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'}

    


Ответы

Ответ 1



Pandas замечательно справляется с подобными задачами: import pandas as pd def merge(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last')) def merge2(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last') .to_dict('records')) В виде Pandas DataFrame: In [72]: merge(x, y) Out[72]: prise status title 1 [70000] [Непродана] [нисан] 2 [70000] [Продана] [Лада] 3 [70000] [Непродана] [БМВ] В виде списка словарей: In [73]: merge2(x, y) Out[73]: [{'prise': '[70000]', 'status': '[Непродана]', 'title': '[нисан]'}, {'prise': '[70000]', 'status': '[Продана]', 'title': '[Лада]'}, {'prise': '[70000]', 'status': '[Непродана]', 'title': '[БМВ]'}]

Ответ 2



z = {} for d in sorted((d for o in (x, y) for d in o), key=lambda d: d['status'] == '[Непродана]'): t = d['title'] if t not in z: z[t] = d z = list(z.values()) print('\n'.join(map(str, z))) # {'title': '[Лада]', 'prise': '[70000]', 'status': '[Продана]'} # {'title': '[нисан]', 'prise': '[70000]', 'status': '[Непродана]'} # {'title': '[БМВ]', 'prise': '[70000]', 'status': '[Непродана]'}

Ответ 3



Обратите внимание первый это не словарь а список, содержащий словари. Объединить словари: x = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Непродана]'},{'title':'[нисан]', 'prise':'[70000]', 'status':'[Непродана]'} y = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'} x.update(y) print "Value : %s" % x

четверг, 23 января 2020 г.

Объединение объектов в массиве по ключу

#javascript #объекты #объединение #lodash


У меня имеется массив с разными данными , который выглядит примерно так:

[ {
   "_id": "556c978be20c7cd0087c6f10",
   "username": "ivan",
   "music": [
     "Metallica"
   ]
  },
  {
   "_id": "556c978be20c7cd0087c6f10",
   "username": "ivan",
   "interests": [
     "Music",
     "Djent"
   ]
  }, 
  {
   "_id": "556c978be20c7cd0087c6f13",
   "username": "alina",
   "interests": [
     "Music",
     "Literature"
   ]
  },
  {
   "_id": "556c978be20c7cd0087c6f13",
   "username": "alina",
   "music": [
     "Skyharbor"         
   ]
  }
]


Как с объединить объекты в массиве по ключам ('_id') следующим образом (приоритет
lodash):   

[ {
   "_id": "556c978be20c7cd0087c6f10",
   "username": "ivan",
   "music": [
     "Metallica"
   ],
   "interests": [
     "Music",
     "Djent"
   ]
  },
  {
   "_id": "556c978be20c7cd0087c6f13",
   "username": "alina",
   "music": [
     "Skyharbor"         
   ]
   "interests": [
     "Music",
     "Literature"
   ]
  }
]

    


Ответы

Ответ 1



Сгруппировать по идентификаторам можно с помощью groupBy, а затем объединить пары с помощью merge: var users = [{ "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "music": [ "Metallica" ] }, { "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "interests": [ "Music", "Djent" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "interests": [ "Music", "Literature" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "music": [ "Skyharbor" ] }]; console.log( _.map( _.groupBy( users, function (u) { return u._id } ), function (g) { return _.merge.apply(this, g) } ) ); P. S. Прошу ногами не бить, в первый раз в жизни вижу lodash.

понедельник, 6 января 2020 г.

Объединения (пример из сетевого программирования)

#c #объединение #сетевое_программирование


Я, видимо, не совсем понимаю, как работают union в Си, поэтому просьба прокомментировать
мои вопросы по следующему небольшому коду. (Чтобы сократить код, приведу только функцию
main())

int main(void)
{
    int sockfd; 
    socklen_t size = 2000;

    union {
       struct sockaddr sa;
       char mas[2000];
    }un;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    getsockname(sockfd, (struct sockaddr*)un.mas,&size);
    printf("%d\n\n", un.sa.sa_family);


    return 0;
}


1) Я ведь даже не заполняю структуру struct sockaddr sa, почему printf() печатает
правильный ответ?

2) Если я вместо union напишу struct, то ответ будет неправильный.

3) Если переменные не будут находиться в union или struct, то вылезает предупреждение
sa.sa_family’ is used uninitialized in this function. 

Помогите, пожалуйста, разобраться
    


Ответы

Ответ 1



Неудобный пример. Представьте что у вас есть юнион: typedef union { struct { int value; // 4 байта }; struct { char a; // 1 байт char b; // 1 байт char c; // 1 байт char d; // 1 байт }; } Test; Первое поле - int - объединяет в себе последующие char поля. В этом концепция union-ов. Вот трейс: Test test; test.value = 0; // value = { 00000000 00000000 00000000 00000000 } test.a = 1; // value = { 00000000 00000000 00000000 00000001 } test.b = 2; // value = { 00000000 00000000 00000010 00000001 } test.c = 3; // value = { 00000000 00000011 00000010 00000001 } test.d = 4; // value = { 00000100 00000011 00000010 00000001 } Видно, что меняя одно из мелких char полей меняется и большое int поле с именем value. По сути, наш union - это int число, но, для удобства, мы разделили это число на 4 байта a,b,c,d. Можем работать как со всеми 4 байтами сразу - value, так и с каждым отдельным байтом - a,b,c,d. В вашем случае всё аналогично. Есть struct sockaddr sa, далее, его представляют как массив из char длинной в 2000 байт. 1.) Заполняете. getsockname(sockfd, (struct sockaddr*)un.mas,&size); // передаёте указатель на начало массива char.Данные пишутся туда, как видно из моего примера с int числом, заполняя a,b,c,d мы меняем value. Здесь так же. Заполняя массив, мы меняем sa. 2.) И это логично, структура - это структура, юнион - это юнион. Не путайте их. 3.) Неужели даже так не получается? struct sockaddr sa; sockfd = socket(AF_INET, SOCK_STREAM, 0); getsockname(sockfd, (struct sockaddr*)&sa,&size); printf("%d\n\n", sa.sa_family);

среда, 5 июня 2019 г.

Как объединить 60000 файлов в один файл?

В директории есть порядка 60000 текстовых файлов, их надо объединить в один файл.
Команда:
cat * > all.txt
не срабатывает:
-bash: /bin/cat: Argument list too long
Попробовал через:
find ./ -name '*.txt' | xargs grep '' > ../all.txt
но столкнулся с тем, что в all.txt записывается и путь, и название файла:
.//file1.txt:row1 .//file1.txt:row2 ...
Какие еще могут быть варианты?


Ответ

touch ../all.txt find ./ -name "*.txt" | xargs cat >> ../all.txt
То есть cat каждого файла по отдельности, а не сразу всех в одной команде cat.

среда, 3 апреля 2019 г.

Как объединить два списка/кортежа словарей (например списки записей БД) в Python

Имеется два списка словаря:
Первый:
x = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Непродана]'},{'title':'[нисан]', 'prise':'[70000]', 'status':'[Непродана]'}
Второй:
y = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'}
Желаемый результат:
z = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[нисан]', 'prise':'[70000]', 'status':'[Непродана]'}, {'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'}


Ответ

Pandas замечательно справляется с подобными задачами:
import pandas as pd
def merge(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last'))
def merge2(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last') .to_dict('records'))
В виде Pandas DataFrame:
In [72]: merge(x, y) Out[72]: prise status title 1 [70000] [Непродана] [нисан] 2 [70000] [Продана] [Лада] 3 [70000] [Непродана] [БМВ]
В виде списка словарей:
In [73]: merge2(x, y) Out[73]: [{'prise': '[70000]', 'status': '[Непродана]', 'title': '[нисан]'}, {'prise': '[70000]', 'status': '[Продана]', 'title': '[Лада]'}, {'prise': '[70000]', 'status': '[Непродана]', 'title': '[БМВ]'}]

суббота, 16 марта 2019 г.

Объединение объектов в массиве по ключу

У меня имеется массив с разными данными , который выглядит примерно так:
[ { "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "music": [ "Metallica" ] }, { "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "interests": [ "Music", "Djent" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "interests": [ "Music", "Literature" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "music": [ "Skyharbor" ] } ]
Как с объединить объекты в массиве по ключам ('_id') следующим образом (приоритет lodash):
[ { "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "music": [ "Metallica" ], "interests": [ "Music", "Djent" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "music": [ "Skyharbor" ] "interests": [ "Music", "Literature" ] } ]


Ответ

Сгруппировать по идентификаторам можно с помощью groupBy, а затем объединить пары с помощью merge
var users = [{ "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "music": [ "Metallica" ] }, { "_id": "556c978be20c7cd0087c6f10", "username": "ivan", "interests": [ "Music", "Djent" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "interests": [ "Music", "Literature" ] }, { "_id": "556c978be20c7cd0087c6f13", "username": "alina", "music": [ "Skyharbor" ] }]; console.log( _.map( _.groupBy( users, function (u) { return u._id } ), function (g) { return _.merge.apply(this, g) } ) );
P. S. Прошу ногами не бить, в первый раз в жизни вижу lodash.

пятница, 8 февраля 2019 г.

Объединения (пример из сетевого программирования)

Я, видимо, не совсем понимаю, как работают union в Си, поэтому просьба прокомментировать мои вопросы по следующему небольшому коду. (Чтобы сократить код, приведу только функцию main())
int main(void) { int sockfd; socklen_t size = 2000;
union { struct sockaddr sa; char mas[2000]; }un;
sockfd = socket(AF_INET, SOCK_STREAM, 0); getsockname(sockfd, (struct sockaddr*)un.mas,&size); printf("%d

", un.sa.sa_family);
return 0; }
1) Я ведь даже не заполняю структуру struct sockaddr sa, почему printf() печатает правильный ответ?
2) Если я вместо union напишу struct, то ответ будет неправильный.
3) Если переменные не будут находиться в union или struct, то вылезает предупреждение sa.sa_family’ is used uninitialized in this function.
Помогите, пожалуйста, разобраться


Ответ

Неудобный пример. Представьте что у вас есть юнион:
typedef union { struct { int value; // 4 байта }; struct { char a; // 1 байт char b; // 1 байт char c; // 1 байт char d; // 1 байт }; } Test;
Первое поле - int - объединяет в себе последующие char поля. В этом концепция union-ов. Вот трейс:
Test test; test.value = 0; // value = { 00000000 00000000 00000000 00000000 } test.a = 1; // value = { 00000000 00000000 00000000 00000001 } test.b = 2; // value = { 00000000 00000000 00000010 00000001 } test.c = 3; // value = { 00000000 00000011 00000010 00000001 } test.d = 4; // value = { 00000100 00000011 00000010 00000001 }
Видно, что меняя одно из мелких char полей меняется и большое int поле с именем value. По сути, наш union - это int число, но, для удобства, мы разделили это число на 4 байта a,b,c,d. Можем работать как со всеми 4 байтами сразу - value, так и с каждым отдельным байтом - a,b,c,d.
В вашем случае всё аналогично. Есть struct sockaddr sa, далее, его представляют как массив из char длинной в 2000 байт.
1.) Заполняете.
getsockname(sockfd, (struct sockaddr*)un.mas,&size); // передаёте указатель на начало массива char.Данные пишутся туда, как видно из моего примера с int числом, заполняя a,b,c,d мы меняем value. Здесь так же. Заполняя массив, мы меняем sa.
2.) И это логично, структура - это структура, юнион - это юнион. Не путайте их.
3.) Неужели даже так не получается?
struct sockaddr sa; sockfd = socket(AF_INET, SOCK_STREAM, 0); getsockname(sockfd, (struct sockaddr*)&sa,&size); printf("%d

", sa.sa_family);