Если вы хотите удалить все пробелы и новые строки, а не только последнюю новую строку, вы можете использоватьtr
:
tr -d '[[:space:]]' < file > file.trimmed
Или, точнее:
tr -d '\t\n ' < file > file.trimmed
Я провел полноценный -тест на тараканье. Я сделал 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--)