Имя столбца печати, которая соответствует строке из командной линии

StackOverflow https://stackoverflow.com/questions/5846300

  •  27-10-2019
  •  | 
  •  

Вопрос

Я хочу ввести название строки (т.е. «col2») в команду Awk или Cut и распечатать столбец, который соответствует этой строке заголовка столбца.

DataFile выглядит так:

COL1 COL2 COL3 COL4 COL5 COL6

a a b d c f

a d g h e f

c v a s g a

Если я прохожу в COL3, я хочу, чтобы он напечатал третью колонку и т. Д. Я думаю, что Awk может быть самой простой вещью, но Cut также может работать. Я просто не уверен, как это сделать.

Это было полезно?

Решение

Awk 1 Liner для задачи выше (если вам интересно):

awk -v col=COL2 'NR==1{for(i=1;i<=NF;i++){if($i==col){c=i;break}} print $c} NR>1{print $c}' file.txt

awk -v col=COL3 'NR==1{for(i=1;i<=NF;i++){if($i==col){c=i;break}} print $c} NR>1{print $c}' file.txt

Просто передайте название вашего столбца COL1, COL2, COL3 и т. Д. -vcol= флаг.

Другие советы

небольшая модификация Анубхава Разместите сверху, для нескольких столбцов

awk -vcol1="COL2" -vcol2="COL6" 'NR==1{for(i=1;i<=NF;i++){if($i==col1)c1=i; if ($i==col2)c2=i;}} NR>0{print $c1 " " $c2}' file.txt

Когда NR> 1 не печатает заголовки столбца. Это было изменено на NR> 0, который должен распечатать столбцы с именами заголовков.

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

awk -v col=NoneSuch 'NR==1{for(i=1;i<=NF;i++){if($i==col){c=i;break}}   if (c > 0) {print $c}} else {print "Column " col "does not exist"} NR>1 && c > 0 {print $c}' file1.txt

Немного неясно, что вы пытаетесь сделать.

Если вы хотите получить один столбец из данных, используйте substr().

Если вы хотите использовать аргумент для выбора столбца, используйте что -то вроде

BEGIN { mycol = ARGV[1] ; }
      { print $mycol }

Обновлять

Хммм, вы хотите обобщенные имена столбцов?

Хорошо, мы предположим, что ваши данные организованы как это:

 XXXXX YYYYY ZZZZZ

И вы хотите назвать столбцы «Harpo», «Groucho» и «Zeppo», и имя столбца в ARGV[1]:

 BEGIN { cols["harpo"] = 1; cols["groucho"] = 2; cols["zeppo"] = 3; }
       { print $cols[ARGV[1]]   }

Второе обновление

Да, этот трюк сделает это. Замените «Гарпо» и т. Д. На «COL1», «COL2» и так далее.

сказать column Это переменная, которую вы заявили, что это столбец, который вы хотите от оболочки. Вы передаете его с помощью awk's -v вариант

column=3
awk -vcol="$column" '{print $col}' file

Когда вы говорите «передавать строку» AWK, я думаю, вы хотите дать строку в командной строке. Один вариант - использовать -v функция определения переменных

$ gawk -f columnprinter.awk -v col=thecolumnnameyouwant

Альтернативно вы можете использовать встроенную переменную ARGV в качестве Чарли объясняет.

Это оставляет только этот вопрос для формирования массива, чтобы связать имена столбцов с номерами столбцов. Если первая строка ввода содержит имена столбцов (общее соглашение), это становится довольно просто.

Использовать

NR==1{...}

Для обработки первого столбца, чтобы получить отображение

NR==1{
   colnum=-1;
   for(i=1; i<=NF; i++)
     if ($i == col) {
        colnum=i
        break
     }
}

который вы можете использовать как

{
  print $colnum
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top