2

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

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

Test01,Test02,Test03,Test04  
11,22,,44  
11,22,,44  
11,22,,44  
11,22,,44  
11,22,,44  
11,22,,44  

8 ответов8

1

Вот решение awk, которое работает независимо от того, какие столбцы пусты (игнорируя заголовок).

awk -F, '{
    a[NR]=$0
}NR>1{
    for (i=1;i<=NF;i++) 
        if(length($i)!=0) b[i]++
}END{
    for (k=1;k<=NR;k++) { 
        LINE="" ; 
        split(a[k],c,",") ; 
        for (j=1;j<=NF;j++) 
            if(b[j]>0) 
                LINE=LINE","c[j] ; 
        print substr(LINE,2,length(LINE)-1)
    } 
}' test.csv
0

Если вы хотите удалить, возможно, непустые столбцы (в том числе в заголовке), используйте команду 'cut':

cut -d , -f 1,2,4 test.csv > new.csv
0

В текущем случае вы можете просто сделать:

sed 's/,,/,/g' test.csv > new.csv

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

0

Это требует программы, а не быстрой команды. Наилучший способ сделать это, как предлагает Эндрю Медико, использовать правильный синтаксический анализатор CSV (в случае perl вас есть Text::CSV).

Однако я подумал, что напишу perl скрипт, который работает в очень простых случаях:

perl -F, -lane 'if($.==1){@a=@F;next};for($i=0;$i<@F;$i++){if($F[$i]!=""){push @c,$F[$i];push @b,$i}}if(@a){foreach(@b){push @t,$a[$_]};print join(",",@t);undef @a}print join(",",@c);undef @c' file.csv

Это сохранит первую строку и позволит узнать, есть ли в следующей строке пустые поля. Затем он печатает только соответствующие заголовки, пропуская пустое поле во всех строках.

Обратите внимание, что он не обрабатывает запятые внутри строк в кавычках. Это, однако, повернуть:

Test01,Test02,Test03,Test04
11,22,,44
11,22,,44
11,22,,44
11,22,,44
11,22,,44
11,22,,44

в:

Test01,Test02,Test04
11,22,44
11,22,44
11,22,44
11,22,44
11,22,44
11,22,44
0

Для обычного пользователя самым простым способом было бы импортировать данные в Excel из этого CSV-файла и экспортировать их еще раз после удаления столбца.

0
  • Если повторяются пустые столбцы ,,, .
  • Если пробелы столбцы 1, , ,,2 (начать с / в середине / в конце).
  • Если он пуст в начале или в конце строки ,123 123,
sed -E ':l;s/,[[:blank:]]*,/,/;tl;s/^[[:blank:]]*,|,[[:blank:]]*$//g'
0

При попытке использования различных подходов bash мне нужно было надежно удалить все пустые столбцы (включая заголовок). Чтобы решить эту проблему, я использовал Python с Pandas.

import pandas as pd

data = pd.read_csv('test.csv', sep='\t')
data.dropna(axis=1).to_csv('test_clean.csv')

Здесь важно добавить axis=1 чтобы Pandas применял dropna к столбцам, а не к строкам.

0

awk присоединяется к вечеринке.

awk -F "," '{print $1","$2","$4}' test.csv > new.csv

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .