Рейтинг:0

объединение текстовых файлов с разделителями табуляции на основе столбца (который является заголовком) в bash?

флаг us

У меня есть два текстовых файла, которые содержат миллионы записей, все записи разделены табуляцией, как мы можем объединить эти два файла на основе одного и того же заголовка (столбца)?

файл:1

    LogEntryTime nameId PartnerId        
    2021-06-05T15:00:53 07 5lsddf qyutxwr 
        
        

файл:2

        nameId GroupId compnayid
        5lsddf l4buafm 0rd33cs               
    

выводить так:

    LogEntryTime nameId PartnerId GroupId compnayId
    2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Пробовал это, но не работает:

вставить файл1.txt файл2.txt | nameId -s $'\t' -t

и

кот файл1.txt файл2.txt | awk -F '\t' '{print $ перечислите здесь имена всех столбцов}'

awk, который работает, но нужно указать все номера столбцов.

есть ли другое решение, помогите мне.

заранее спасибо

vanadium avatar
флаг cn
Я бы, вероятно, использовал базу данных для этого.
Vamshi Krishna CH avatar
флаг us
в сценарии оболочки, как мы можем этого добиться?
vanadium avatar
флаг cn
Я не думаю, что это будет легко. Много петель, и это будет медленно.
Vamshi Krishna CH avatar
флаг us
для сотен записей также использовать ту же процедуру?
vanadium avatar
флаг cn
Если порядок записей идентичен во всех текстовых файлах (т. е. запись 2 в файле 1 соответствует записи 2 в файле 2 и т. д.), то ваша команда awk с вставкой вырежет ее. Лучше добавьте эту информацию к вашему вопросу. Я предполагал, что данные должны сопоставляться, например, `nameid 5lsddf` — это запись 1 в файле 1, но запись *x* в файле 2.
Vamshi Krishna CH avatar
флаг us
тот же столбец будет вырезаться во втором слиянии файлов с первым файлом. это все
Vamshi Krishna CH avatar
флаг us
Вы можете помочь в этом?
Рейтинг:2
флаг cn

Зациклите один из файлов в массиве и замените первое поле второго файла (которое nameId) с индексом массива, соответствующим общему полю.

awk -F \t+ -vOFS=\t 'NR==FNR{a[$2]=$0;следующий} {$1=a[$1]}1' файл{1,2}.txt
Рейтинг:2
флаг hr

Если ваши файлы представляют собой правильно созданные файлы с разделителями табуляции (TSV), вы можете использовать csvjoin на основе Python csvkit упаковка.

Бывший. данный:

$ головной файл1.tsv файл2.tsv | кот -А
==> файл1.tsv <==$
LogEntryTime^InameId^IPartnerId$
2021-06-05T15:00:53 07^I5lsddf^Iqyutxwr$
$
==> файл2.tsv <==$
nameId^IGroupId^IcompnayId$
5lsddf^Il4buafm^I0rd33cs$

(кот -А сделать вкладки видимыми, т.к. ^ я) тогда

$ csvjoin -I -t -c nameId file1.tsv file2.tsv
LogEntryTime, nameId, PartnerId, GroupId, compnayid
2021-06-05T15:00:53 07,5lsddf,qyutxwr,l4buafm,0rd33cs

Чтобы вернуть вывод в формате TSV, используйте CSVформат из того же пакета:

$ csvjoin -I -t -c nameId file1.tsv file2.tsv | CSVформат -T
LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Обратите внимание, что отключает вывод типа, который иногда может вести себя неожиданно, особенно с полями даты и времени.


Еще проще, используя Миллер (доступен в репозитории юниверса в виде пакета мельник):

$ mlr --tsv join -f file1.tsv -j nameId then reorder -f LogEntryTime file2.tsv
LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Изменение порядка необходимо, потому что по умолчанию млр присоединиться сначала выводит общее поле (так же, как система присоединиться команда). Обратите внимание, что для несортированного ввода все файл1.tsv будет загружен в память.

Рейтинг:1
флаг cn

С этим конкретным набором данных:

хорошо '
    НАЧАЛО {FS = OFS = "\t"}
    NR == FNR {f1[$2] = $0; следующий}
    {$1 = f1[$1]; Распечатать}
' файл{1,2}.txt

Упоминается только поле соединения ($2 в файле1, $1 в файле2).

Производит вывод, разделенный табуляцией

LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Для красивого вывода направьте в | столбец -t -s $'\t' получить

LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.