Как уменьшить количество разделителей, используя sed или awk - PullRequest
0 голосов
/ 02 мая 2018

У меня есть данные, которые должны быть 30 столбцов в каждой строке. Экспорт не полностью выполнен, и я иногда получаю 32-50 столбцов, потому что в самих полях есть дополнительные разделители табуляции.

Мне также нужно удалить запятые из моих тысяч с помощью следующей программы sed.

sed '/[0-9],[0-9]./ {s/,//g; }' $oldfile > $newfile

Итак, как мне преобразовать следующие данные, исключив запятые и добавив дополнительный разделитель в последний столбец

вот мой пример ввода:

Column1 Column2 Column3
James   1,203.33    comment1
Mike    -3,434.09   testing testing 123
Sarah   1,343,342.23    there   here

Я бы хотел, чтобы результат был:

Column 1    Column2 Column3
James   1203.33 comment1
Mike    -3434.09    testing_tab_testing_tab_123
Sarah   1343342.23  there_tab_here

Так что в конце мне нужно удалить запятые, когда они появляются в числе Я также хочу найти строки с более чем 3 (или соответствующим количеством вкладок), а затем замените вкладки после трех на tab , чтобы я мог обращаться с ними после загрузки их в свою базу данных, и все будет в 3 столбцах.

Я надеялся, что смогу сделать это в sed (в котором я новичок) или в awk (я вообще не знаю awk), потому что sed действительно быстро обрабатывает все это.

Редактировать: Это то, что в итоге получилось лучше всего для моей ситуации

sed '/[0-9],[0-9]./ {s/,//g; };s/\t/_tab_/3g' input_file

сначала он удаляет все запятые между двумя числами. Затем он заменяет мои вкладки на « tab » после третьего вхождения. Я проверю это на работе.

Моя причина, по которой я не использую perl, заключается в том, что мои ограниченные знания об этом заставляют меня полагать, что для оценки потребуется загрузить документ в память, и эти документы имеют размер от 5 до 30 ГБ, что обычно превышает объем памяти моего компьютера.

Я дам вам знать, если что-то пойдет не так, когда я использую это на работе, но я действительно ценю всю помощь.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Хитрая часть заменяет эти вкладки. Давайте рассмотрим это поэтапно.

Сначала мы пытаемся заменить каждую вкладку на "_tab _";

sed 's/\t/_tab_/g'

Column1_tab_Column2_tab_Column3
James_tab_1,203.33_tab_comment1
Mike_tab_-3,434.09_tab_testing_tab_testing_tab_123
Sarah_tab_1,343,342.23_tab_there_tab_here

(Обратите внимание, что команда содержит "\ t", что означает TAB. Не все версии sed допускают это; вам, возможно, придется использовать реальную вкладку.) После того, как у нас это получится, мы можем попробовать заменить вкладки, начиная с в третьих. Некоторые версии sed позволяют это:

sed 's/\t/_tab_/3g'

Если ваш sed не позволяет этого, возможно, вам придется прибегнуть к замене последней вкладки (если их больше двух):

sed 's/\(\t.*\t.*\)\t/\1_tab_/'

(вы можете или не должны избегать скобок с обратными слешами, как я это сделал), а затем повторять эту операцию до тех пор, пока она не прекратит делать что-либо, посредством условного перехода к метке:

sed -e :a -e 's/\(\t.*\t.*\)\t/\1_tab_/;t a'

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

... -e 's/\([0-9]\),/\1/g'
0 голосов
/ 02 мая 2018

Вы можете попробовать это awk

awk -F'\t' -v nbcol=3 '
 {a=""
 for(i=1;i<=NF;i++)
   {if($i~/[-0-9+,\.]*/)
     gsub(",","",$i)
   if(i>nbcol)a=a"_"$i}
 $0=$1 FS $2 FS $3 a
}1' infile.txt

-F '\ t' разделитель полей

nbcol = 3 столбца для слияния

a = "" строка для объединяемого столбца должна быть инициализирована пустой строкой

для (i = 1; i <= NF; i ++) работают в каждой строке </p>

if ($ i ~ / [- 0-9 +,.] * /) Gsub (",", "", $ i)

Если поле является числом, удалите каждое,

if (i> nbcol) a = a "_" $ i}

если номер поля больше, чем nbcol, объединить его в строку a

$ 0 = $ 1 FS $ 2 FS $ 3 a

в конце каждой строки восстанавливайте $ 0 и печатайте строку с 1

0 голосов
/ 02 мая 2018

Удалите запятые, когда они появляются в числе. Я также хочу найти строки, содержащие более 3 (или соответствующее количество вкладок), а затем заменить вкладки после трех на вкладку

Чтобы удалить запятые, когда они появляются в числе:

sed -E 's/([0-9]+),/\1/g' inputfile

Чтобы заменить три или более вкладок одной вкладкой:

sed -E 's/\t{3,}/\t/g' inputfile

Или применить обе подстановки в одной команде:

sed -E 's/([0-9]+),/\1/g;s/\t{3,}/\t/g' inputfile

Пример ввода (здесь \t означает вкладку):

Column1 Column2 Column3
James   1,203.33 \t\t\t comment1
Mike    -3,434.09 \t\t testing testing 123
Sarah   1,343,342.23 \t\t\t there   here

Выход:

Column1 Column2 Column3
James   1203.33 \t comment1
Mike    -3434.09 \t\t testing testing 123
Sarah   1343342.23 \t there   here

Редактировать: чтобы заменить \t на _tab_ для 3-х или более вхождений в данной строке, вы можете использовать perl:

perl -pe 's{\t}{++$n >= 3 ? "_tab_" : $&}ge' inputfile

Пример ввода:

Column1 Column2 Column3
James  \t 1,203.33 \t comment1
Mike  \t  -3,434.09 \t testing\ttesting\t123
Sarah  \t 1,343,342.23 \t there\there

Выход:

Column1 Column2 Column3
James  \t 1,203.33 \t comment1
Mike  \t  -3,434.09 \t testing_tab_testing_tab_123
Sarah  \t 1,343,342.23 \t there_tab_here
...