Имя столбца печати, которая соответствует строке из командной линии
Вопрос
Я хочу ввести название строки (т.е. «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
}