Замена подчеркивания запятой и удаление двойных кавычек в CSV

10

У меня есть файл CSV как

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. и так далее.

Мне нужно конвертировать этот файл CSV в

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
RKR
источник

Ответы:

24

Намного проще использовать tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Это работает так, что trпринимает два аргумента - набор символов для замены и их замену. В этом случае у нас есть только наборы из 1 символа. Мы перенаправляем поток input.csvввода trstdin через <оператор оболочки и направляем полученный результат tr -d '"'для удаления двойных кавычек.

Но awkтоже могу это сделать.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Это немного отличается: awk читает каждый файл построчно, каждый встроенный скрипт /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Здесь у нас нет шаблона, поэтому он означает выполнение кодового блока для каждой строки. gsub()Функция используется для глобальной подстановки внутри строки, поэтому мы используем ее для замены подчеркивания запятыми, а двойные кавычки - пустой строкой (эффективно удаляя символ). 1На месте матча шаблона с отсутствующим блоком кода, который по умолчанию просто для печати линии; другими словами, кодовый блок с gsub()выполняет работу и 1печатает результат.

Используйте команду redirection ( >) для отправки вывода в новый файл:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv
Сергей Колодяжный
источник
Apologies.I также хотел , чтобы удалить Кавычки too.I обновленный вопрос
РКР
@RKR Ответ обновлен соответственно, ответ Яна также обновлен
Сергей Колодяжный
13

В качестве альтернативы вы также можете использовать эту sedкоманду:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
IanC
источник
1
В одинарных кавычках не нужно избегать двойных кавычек.
Гленн Джекман
Действительно @glennjackman! Я только что удалил
убегающую
10

Perl, «швейцарская армейская бензопила» обработки текста в командной строке, также может сделать это. Синтаксис (не по совпадению) очень похож на trи sedпримеры:

perl -pe 'tr/_"/,/d' input.csv > result.csv

или:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Но, честно говоря, если вы не хотите тратить время на изучение нового языка программирования (а это действительно то, что есть в awk, Perl, sed и других подобных инструментах) именно для этой основной задачи, вы также можете сделать это в любой текстовый редактор, который поддерживает поиск и замену:

  1. Откройте файл CSV в вашем любимом текстовом редакторе (например, в gedit, kate, коврике для мыши и т. Д .; даже обычный старый блокнот или Wordpad в Windows могут это сделать).

  2. Выберите «Поиск и замена» из меню (обычно находится в разделе «Редактировать», если отдельного меню «Поиск» не существует).

  3. Введите _в поле поиска и ,в поле замены.

  4. Нажмите «Заменить все».

  5. Повторите с "в поле поиска и ничего в поле замены.

  6. Сохраните файл.

Теперь, если вам нужно сделать это для 100 или 1000 файлов вместо одного, то изучение нового инструмента командной строки начинает иметь смысл. И, конечно, как только вы знаете, как использовать Perl, sed или что-то еще, вы сэкономите много времени и усилий с подобными задачами позже. Но для единовременной работы, которую вы не ожидаете делать снова, иногда простой интерактивный инструмент, такой как текстовый редактор, является самым простым решением.

Илмари Каронен
источник
3

Вы могли бы сделать это vimтакже.

Откройте файл:, vim input.csvзатем используйте vimрасширенный инструмент поиска s. Введите двоеточие ( :), чтобы войти в командный режим, и выполните команды следующим образом:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

Практически те же команды, что и в ответе IanC, но внутри vimвместо использования sed.

Вопросительный знак
источник
2

Почему бы просто не изменить значения по умолчанию входных и выходных значений разделителя

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
Антуан Сехикян
источник