2017-02-09 6 views
-3

У меня есть несколько файлов CSV. Мне нужно удалить столбцы 5 и 6 из них. Пример file.csv:Мне нужно вырезать столбцы 5 и 6 из нескольких сотен файлов

column1,column2,column3,mm/dd/yyyy,column5,column6,column7,...,column52 

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

+0

Имеются ли какие-либо поля? Например: 'column3," column4, запятая в поле ", column5'. (Это всего 3 поля, но любое тривиальное решение регулярных выражений будет разбито на 4 и сломает поля, указанные в кавычках.) У полей есть пробелы между столбцами после запятой, как вы показываете? CSV удивительно сложна ... – dawg

+0

Между запятыми нет пробелов. В некоторых полях нет котировок, но есть пробелы. а также косые черты в полях даты и двоеточиях на отметках времени. –

+1

Тогда исправьте свой пример. Спасибо – dawg

ответ

3

Вы можете использовать cut в цикле , предполагая, что все ваши файлы имеют не менее 7 столбцов:

for file in *.csv; do 
    cut -f1-4,7- -d, "$file" > "$file".reduced 
    # move reduced file to original once tested 
    # mv "$file".reduced "$file" 
done 
  • -f1-4,7- => получить поля 1-4, а затем 7 и далее (в основном, удалите 5 & 6)
+1

Я быстро проверил разрез и движение. Кажется, это работает. Я буду дополнительно проверять это, прежде чем принимать ваш ответ. Спасибо. –

+0

Чтобы переименовать несколько файлов, которые я планирую использовать: 'for i in * .csv.reduced do j =' echo $ i | sed "s/.reduced //" ' mv $ i $ j done' –

1

С GNU СЭД:

sed 's/,[^,]*//4;s/,[^,]*//4' file 

Добавить -i флаг редактировать файл в месте:

sed -i 's/,[^,]*//4;s/,[^,]*//4' file 

или короче:

sed 's/\([^,]*,\)\{2\}//3' file 
0
perl -p -i -e '{if(/(.*),(.*),(.*),(.*),.*,.*,(.*)/) {print "$1,$2,$3,$4,$5\n"}}' file.csv 

Это будет непосредственно обновить файл после удаления 5-й и 6-й колонны.

Смежные вопросы