Получение данных из 3-го экземпляра _ переменной с помощью awk

Команда sort имеет определенную поддержку для работы с огромными наборами данных, поскольку это относительно распространенный вариант использования. Огромные шаблоны grep — чрезвычайно необычный вариант использования, поэтому вы не можете надеяться, что разработчики приложили к этому много усилий.

Если порядок строк не имеет значения, вы можете отсортировать два файла, после чего их можно будет сравнить, не сохраняя в памяти более нескольких строк за раз, независимо от длины файлов. Поскольку сортировка может справиться с файлами, которые не помещаются в памяти, это эффективно.

sort originallist >originallist.sorted
sort cleaned1 | comm -23 originallist.sorted - >cleaned2.sorted

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

nl -w 22 originallist >originallist.numbered
# then generate cleaned1 from the numbered list

Поскольку originallist.numberedотсортирован, вы можете запустить commдля него, чтобы обнаружить общие строки.

Если порядок имеет значение и нумеровать строки слишком поздно, можно попробовать разбить cleaned1на куски и сделать по одному проходу в originallistдля каждого куска. С недавним расколом GNU:

cp originalfile cleaned2.in
split -l 1000000 --filter='grep -Fxv -f - cleaned2.in >cleaned2.out; mv cleaned2.out cleaned2.in' cleaned1
mv cleaned2.in cleaned2

(Обратите внимание, что Fне выполняет «совпадение полной строки», а выполняет сопоставление подстроки. Для полного совпадения строк вам также потребуется -x.)

0
03.09.2019, 10:28
2 ответа

Наряду с использованием awk, использование cutнамного проще. Просто определите разделитель и количество полей для анализа из

imp_2=$(printf '%s\n' "$imp_1" | cut -d_ -f4-)
printf '%s\n' "$imp_2"

Для imp_3 - imp_2, т.е. неуникальных строк между двумя переменными, используйте утилиту comm

comm -3 <(echo "$imp_3") <(echo "$imp_2")
2
28.01.2020, 02:29

Ниже приведена попытка, которую я предпринял для imp1

echo $imp_1|awk -F "_" '{$1=$2=$3="";print $0}' |sed -r "s/^\s+//g"|sed -r "s/\s+$//g"|sed "s/ /_/g"

выход

Cust_support
Call_Detail
Area
0
28.01.2020, 02:29

Теги

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