2015-08-02 2 views
1

Я работаю над скриптом оболочки, в котором есть много команд SED и AWK. Теперь, я застрял в месте, где я не мог идти дальше.AWK, SED для отображения столбца на основе имени столбца

Например: Если я запустил команду ниже. Он печатает первый столбец.

awk 'OFS="\t" {print $1;}' finename.txt 

Но есть ли способ распечатать конкретный столбец с использованием имени столбца вместо номера столбца. Угадайте, нет прямого способа сделать это, но должен быть какой-то трюк, чтобы сделать это.

Примеры данных (вкладка отделено)

itemNumber Price Mango Apple Bannana 
    112201  purchased need-to-plan purchased 
    112202 55 yet-to-buy yet-to-buy purchased 
    112202 67 need-to-plan purchased purchased 
    112203 456 need-to-plan need-to-plan need-to-plan 
    112203 33 need-to-plan yet-to-buy need-to-plan 
    112204 456 need-to-plan yet-to-buy need-to-plan 
    112204  yet-to-buy purchased need-to-plan 
    112205 77 yet-to-buy purchased need-to-plan 
    112205 99 yet-to-buy purchased yet-to-buy 
    112206 0 yet-to-buy purchased yet-to-buy 

ответ

3

Что-то вроде этого? awk -vcol=Price '(NR==1){colnum=-1;for(i=1;i<=NF;i++)if($(i)==col)colnum=i;}{print $(colnum)}' filename.csv

я должен объяснить:

  • -v устанавливает переменную, так и с -vcol=Price я объявляю колонки, что я ищу.
  • (NR==1) выбирает первую строку и код после этого просматривает заголовки столбцов для тех, которые мы хотим распечатать.
  • Наконец, мы печатаем столбец.

Для нескольких столбцов подход аналогичен:

awk -F'\t' -vcols=fun,coming '(NR==1){n=split(cols,cs,",");for(c=1;c<=n;c++){for(i=1;i<=NF;i++)if($(i)==cs[c])ci[c]=i}}{for(i=1;i<=n;i++)printf "%s" FS,$(ci[i]);printf "\n"}' filename.csv

+0

Вы можете добавить '-F '\ t'', так как данные, кажется, есть некоторые пустые столбцы, поэтому пробелы по умолчанию разделитель по не будет содержать индексы столбцов. – meuh

+0

Да -F '\ t' сделает это. Как обычно, у вас много вариантов. Разделенный вкладкой: 'BEGIN {IFS =" \ t "}' output: 'BEGIN {OFS =" \ t "}' и оба 'BEGIN {FS =" \ t "}'. Но -F является самым коротким участником, поэтому должен победить :-) –

+0

@MaxMurphy - Thats Awesome. Именно то, что я искал. –

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