Как удалить дубликаты элементов в одной линии из файла CSV?

-size с суффиксом b предназначен для 512-байтовых блоков, а не байтов. 5000000b - это 2 560 000 000 байт или 2,5 ГБ

Попробуйте:

find /home -size +5M -name "error_log" -exec rm -rf {} \;

Из руководства GNU find:

-size n[cwbkMG]. Файл использует n единиц пространства. Можно использовать следующие суффиксы:

`b' для 512-байтовых блоков (это значение по умолчанию, если суффикс не используется)

`c' для байтов

`w' для двухбайтовых слов

`k' для килобайтов (единицы 1024 байта)

`M' для мегабайтов (единицы 1048576 байт)

`G' для гигабайтов (единицы 1073741824 байт)

Размер не учитывает косвенные блоки, но учитывает блоки в разреженных файлах, которые фактически не выделены. Имейте в виду что спецификаторы формата -printf %k' и %b' обрабатывают разреженные файлы по-разному. Суффикс `b' всегда обозначает 512-байтовые блоки и никогда - 1-килобайтовые блоки, что отличается от поведения параметра с поведением параметра -ls.

0
08.10.2018, 16:54
2 ответа

можешь попробовать:

#!/bin/bash

cat file | while IFS= read -r line ; do 
echo "$line" | tr, '\n' | sort -u | tr '\n', | sed 's/,$/\n/' ; 
done 
0
28.01.2020, 04:12

Это работа не для bash, а для инструментов, более подходящих для обработки таких больших данных, как awk.

Сначала позвольте мне создать образец файла с именем mycsv:

head -n2 mycsv
1field1,1field2,1field3,1field4,1field5,1field6,1field7,1field8,1field9,1field10,1field11,1field12,1field13,1field14,1field15,1field16,1field17,1field18,1field19,1field20,1field5,1field12
2field1,2field2,2field3,2field4,2field5,2field6,2field7,2field8,2field9,2field10,2field11,2field12,2field13,2field14,2field15,2field16,2field17,2field18,2field19,2field20,2field5,2field12

tail -4 mycsv
3997field1,3997field2,3997field3,3997field4,3997field5,3997field6,3997field7,3997field8,3997field9,3997field10,3997field11,3997field12,3997field13,3997field14,3997field15,3997field16,3997field17,3997field18,3997field19,3997field20,3997field5,3997field12,3997field21
3998field1,3998field2,3998field3,3998field4,3998field5,3998field6,3998field7,3998field8,3998field9,3998field10,3998field11,3998field12,3998field13,3998field14,3998field15,3998field16,3998field17,3998field18,3998field19,3998field20,3998field5,3998field12
3999field1,3999field2,3999field3,3999field4,3999field5,3999field6,3999field7,3999field8,3999field9,3999field10,3999field11,3999field12,3999field13,3999field14,3999field15,3999field16,3999field17,3999field18,3999field19,3999field20,3999field5,3999field12
4000field1,4000field2,4000field3,4000field4,4000field5,4000field6,4000field7,4000field8,4000field9,4000field10,4000field11,4000field12,4000field13,4000field14,4000field15,4000field16,4000field17,4000field18,4000field19,4000field20,4000field5,4000field12

Теперь давайте проверим это awkрешение:

time awk -v RS=",|\n" '{if (!s[$0]++) {printf("%s%s",$0,(RT=="\n"?"\n":","))} else {printf("%s",(RT=="\n"?"\n":""))}}' mycsv |sed 's/,$//g' >mycsv2

real    0m0.131s
user    0m0.121s
sys 0m0.024s


head -2 mycsv2
1field1,1field2,1field3,1field4,1field5,1field6,1field7,1field8,1field9,1field10,1field11,1field12,1field13,1field14,1field15,1field16,1field17,1field18,1field19,1field20
2field1,2field2,2field3,2field4,2field5,2field6,2field7,2field8,2field9,2field10,2field11,2field12,2field13,2field14,2field15,2field16,2field17,2field18,2field19,2field20

tail -4 mycsv2
3997field1,3997field2,3997field3,3997field4,3997field5,3997field6,3997field7,3997field8,3997field9,3997field10,3997field11,3997field12,3997field13,3997field14,3997field15,3997field16,3997field17,3997field18,3997field19,3997field20,3997field21
3998field1,3998field2,3998field3,3998field4,3998field5,3998field6,3998field7,3998field8,3998field9,3998field10,3998field11,3998field12,3998field13,3998field14,3998field15,3998field16,3998field17,3998field18,3998field19,3998field20
3999field1,3999field2,3999field3,3999field4,3999field5,3999field6,3999field7,3999field8,3999field9,3999field10,3999field11,3999field12,3999field13,3999field14,3999field15,3999field16,3999field17,3999field18,3999field19,3999field20
4000field1,4000field2,4000field3,4000field4,4000field5,4000field6,4000field7,4000field8,4000field9,4000field10,4000field11,4000field12,4000field13,4000field14,4000field15,4000field16,4000field17,4000field18,4000field19,4000field20

Давайте также попробуем bashрешение:

time cat mycsv | while IFS= read -r line ; do  echo "$line" | tr, '\n' | sort -u | tr '\n', | sed 's/,$/\n/' ;  done >mycsv3

real    0m27.880s
user    0m28.385s
sys 0m17.863s

head -2 mycsv3
1field1,1field10,1field11,1field12,1field13,1field14,1field15,1field16,1field17,1field18,1field19,1field2,1field20,1field3,1field4,1field5,1field6,1field7,1field8,1field9
2field1,2field10,2field11,2field12,2field13,2field14,2field15,2field16,2field17,2field18,2field19,2field2,2field20,2field3,2field4,2field5,2field6,2field7,2field8,2field9

tail -4 mycsv3
3997field1,3997field10,3997field11,3997field12,3997field13,3997field14,3997field15,3997field16,3997field17,3997field18,3997field19,3997field2,3997field20,3997field21,3997field3,3997field4,3997field5,3997field6,3997field7,3997field8,3997field9
3998field1,3998field10,3998field11,3998field12,3998field13,3998field14,3998field15,3998field16,3998field17,3998field18,3998field19,3998field2,3998field20,3998field3,3998field4,3998field5,3998field6,3998field7,3998field8,3998field9
3999field1,3999field10,3999field11,3999field12,3999field13,3999field14,3999field15,3999field16,3999field17,3999field18,3999field19,3999field2,3999field20,3999field3,3999field4,3999field5,3999field6,3999field7,3999field8,3999field9
4000field1,4000field10,4000field11,4000field12,4000field13,4000field14,4000field15,4000field16,4000field17,4000field18,4000field19,4000field2,4000field20,4000field3,4000field4,4000field5,4000field6,4000field7,4000field8,4000field9

Судя по всему, решение bash в 30 раз медленнее, а также содержит ошибки из-за использования sort -u, которые путают поля, если в полях присутствуют числа.

0
28.01.2020, 04:12

Теги

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