Заміна підкреслення комою та видалення подвійних лапок у 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

Відповіді:


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вхідний trпотік stdin через <оператор оболонки і передаємо отриманий результат 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друкує результат.

Використовуйте перенаправлення оболонки ( >), щоб надіслати вихід у новий файл:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

Вибачення. Я також хотів зняти перевернуті коми. Я оновив питання
RKR

@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

1
У межах однієї лапки не потрібно уникати подвійної цитати.
glenn jackman

Справді @glennjackman! Я щойно зняв
нахил, який протікає

10

Perl, "бензопила швейцарської армії" для обробки тексту командного рядка, також може це зробити. Синтаксис (не випадково) досить схожий на trта sedприклади:

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

або:

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

Але якщо чесно, якщо ви не хочете витрачати час на вивчення нової мови програмування (що насправді є дивним, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.