объединить csv со многими полями, не нарушая порядка

Если вы хотите удалить все пробелы и новые строки, а не только последнюю новую строку, вы можете использоватьtr:

tr -d '[[:space:]]' < file > file.trimmed

Или, точнее:

tr -d '\t\n ' < file > file.trimmed
0
08.02.2020, 11:49
1 ответ

Я провел полноценный -тест на тараканье. Я сделал CSV из 5 миллионов строк по 500 столбцов (20 ГБ )и дополнительный файл из 5 миллионов строк по 2 столбца. Ключевые поля уникальны (У меня было пять миллионов простых чисел ), которые находились в столбце 170 большого файла и столбце 1 дополнительного файла. Оба файла содержали ключи в произвольном порядке. Все остальные поля содержали случайный выбор примерно из 14 000 слов (, вырванных из справочных страниц ).

Сценарий awk выполнялся почти 20 минут и использовал около 0,8 ГБ памяти . Это на ноутбуке 4 ГБ и жестком диске на 5400 об / мин. Этот журнал показывает время и размеры файлов, а также количество столбцов.

Paul--) time./datMerge

real    18m31.740s
user    10m21.632s
sys 1m48.316s
Paul--) wc -lc *max*
    5061456 20045559105 FileA.max.csv
    5061456    85634275 FileB.max.csv
    5061456 20085640276 FileC.max.csv
   15184368 40216833656 total
Paul--) for f in F*max*; do
> awk '-F,' '{ printf ("%8d %s\n", NF, FILENAME); }' "${f}"
> done | uniq -c
5061456      500 FileA.max.csv
5061456        2 FileB.max.csv
5061456      501 FileC.max.csv
Paul--) ls -l F*max*
-rw-r--r-- 1 paul paul 20045559105 Feb  8 19:49 FileA.max.csv
-rw-r--r-- 1 paul paul    85634275 Feb  8 19:49 FileB.max.csv
-rw-r--r-- 1 paul paul 20085640276 Feb  8 20:24 FileC.max.csv
Paul--) 

Я сделал мини-версию файлов, чтобы показать, что он делает, шесть строк по шесть столбцов с ключом в столбце 4.

Paul--) head F*mini*
==> FileA.mini.csv <==
rather,complies,finite,99999847,AM,Or
elapsed,plied,nearperfect,99999989,pr,WinChip
phiopt,reflects,bottom,99999959,128N,careful
fpackstructn,realworld,msingleexit,99999931,0xffff,maxmimum
simplified,mpopcntb,FrontCover,99999971,523x,requisite
cede,fdumprtlbtl2,atmega649a,99999941,LC_MESSAGES,errno

==> FileB.mini.csv <==
99999847,symbols
99999931,fdumprtldbr
99999959,ambiguous
99999971,crc
99999989,munsafedma

==> FileC.mini.csv <==
rather,complies,finite,99999847,AM,Or,symbols
elapsed,plied,nearperfect,99999989,pr,WinChip,munsafedma
phiopt,reflects,bottom,99999959,128N,careful,ambiguous
fpackstructn,realworld,msingleexit,99999931,0xffff,maxmimum,fdumprtldbr
simplified,mpopcntb,FrontCover,99999971,523x,requisite,crc
cede,fdumprtlbtl2,atmega649a,99999941,LC_MESSAGES,errno,Default
Paul--) 

Это сценарий слияния. Я могу опубликовать сценарий создания данных, если это будет информативно.

Paul--) cat datMerge
#! /bin/bash
#: datMerge

LC_ALL="C"

function Merge {

    local AWK='''
BEGIN { FS = ","; OFS = ","; K = 170; Null = "Default"; }
NR == FNR { htMap[$1] = $2; next; }
{ printf ("%s%s%s\n", $0, OFS, ($(K) in htMap) ? htMap[$(K)] : Null); }
'''
    awk "${AWK}" "${@}"
}

    Merge "FileB.max.csv" "FileA.max.csv" > "FileC.max.csv"

Paul--) 
1
28.04.2021, 23:24

Теги

Похожие вопросы