Чи є заклинання командного рядка, щоб скинути стовпчик у CSV-файл?


32

Файл із таким вмістом:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

Я прагну отримати файл, рівний оригіналу, але йому не вистачає n-го стовпця, наприклад, для n = 2 (або може бути 3)

1111,2222,4444
aaaa,bbbb,dddd

або, для n = 0 (або може бути 1)

2222,3333,4444
bbbb,cccc,dddd

Справжній файл може бути гігабайт, який має десятки тисяч стовпців.

Як завжди в таких випадках, я підозрюю, що маги командного рядка можуть запропонувати елегантне рішення ... :-)

У моєму реальному випадку мені потрібно скинути два перших стовпчика, що можна зробити, скинувши перший стовпець двічі послідовно, але я вважаю, що було б цікавіше трохи узагальнити.


Чи гарантовано поля не містять поля ,? (Тобто, ,коли-небудь використовується як роздільник поля.)
CVn,

@ MichaelKjörling, було б непогано мати гнучкіше рішення, але в моєму випадку - так: роздільник є, ,і він ніколи не виникає всередині поля.
Іван

У такому випадку відповідь Скотта повинна бути лише річчю.
CVn

Відповіді:


47

Я вважаю, що це специфічно для вирішення основних принципів GNU:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

Зазвичай ви вказуєте потрібні поля через -f, але додаючи - доповнення, ви перетворюєте значення, природно. З 'man cut':

--complement
    complement the set of selected bytes, characters or fields

Одне застереження: якщо будь-який із стовпців містить кому, він буде викинутий, тому що вирізання не є аналізатором CSV так само, як електронна таблиця. У багатьох аналізаторів є різні ідеї щодо того, як обробляти вхідні коми в CSV. Для простого випадку CSV у командному рядку вирізати все-таки слід.


4
Це добре працює, якщо це простий файл CSV. Якщо будь-який із стовпців - це рядок із комою, він викинеться cut, оскільки це не аналізатор CSV. Якщо поле CSV має значення роздільника поля, воно загорнуте в лапки. До речі, по темі cut, -fприймає діапазони полів. cut -f, -d3-виведе третє поле, видаливши перші два.
Олексій

2
Ви маєте на увазіcut -d, -f3-
Марно

@ Алексіос, це хороший момент. Я ніколи насправді не маю справу з "справжнім" CSV, лише простим підмножиною. Я відредагую свою відповідь, щоб це відобразити.
Скотт МакКлунг

@Useless: Чорт, так. Це те, що я називаю свою "вирізану дислексію" знову вражаючою. зітхати . Скотт: Файли CSV - хитрі звірі. Занадто багато різних підформатів, деякі з яких навіть не є C SV, але їх умовно так і називають.
Олексій

Це надрукує новий CSV на мій термінал - як я можу його перезаписати вхід (або, можливо, записати в новий файл, схоже, що ОП шукав)?
Макс Геніс

12

Якщо дані просто зроблені з розділених комами стовпців:

cut -d , -f 1-2,4-

Ви також можете використовувати awk, але це трохи незручно, оскільки очищаючи поле легко, видалення роздільника вимагає певної роботи. Якщо у вас немає порожнього поля, це не дуже погано:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

Якщо у вас є фактичний CSV, де коми можуть з’являтися всередині полів при правильному цитуванні, вам потрібна справжня бібліотека CSV .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.