匹配列标题并使用awk打印列的值


0

我在列中的文件中有一个数据。我想编写一个脚本,它显示与列标题匹配的列的数据。

C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8 C-9
10  30  35  20  9   65  87  30  29
40  32  67  78  30  54  24  21  13
50  43  32  12  43  65  78  67  54

如果用户选择显示C-8列,那么输出必须是

C-8
30
21
67

我不确定如何匹配列名称并使用awk打印输出。

谢谢, KJ

Answers:


1

创建一个脚本,例如调用 script.sh 有了这个:

awk -v COLT=$1 '
        NR==1 {
                for (i=1; i<=NF; i++) {
                        if ($i==COLT) {
                                title=i;
                                print $i;
                        }
                }
        }
        NR>1 {
                if (i=title) {
                        print $i;
                }
        }
' file

哪里 file 是列中数据的文件。

如果你发行 script.sh C-8 然后结果将是:

C-8
30
21
67

感谢您的解决方案,它完美无缺。你能解释一下“column = $ {column:( - 1)}”是什么。
KumarJohn

采用变量的最后一个字符 column
jcbermu

我做了一个更改,使用* title列而不是数字
jcbermu

如果列号匹配如果列号不匹配并且列名称是某些文本(如名称,Rollno),则此工作正常,在这种情况下此脚本将不起作用。
KumarJohn

如果没有加工,它什么也没有显示。如果列上的文字是这样的 Rollno 例如,改变变量 to_remove 在剧本上。
jcbermu

1

没有 awk,您可以使用以下命令:

cut $FILE -f `head -1 $FILE | tr "\t" "\n" | grep -n "^$COLUMNTITLE"'$' | cut -f 1 -d :`

仅当存在与精确匹配的单个列时才起作用 $COLUMNTITLE


1

试试这个:

function proj() {
    awk -v c="$1" 'NR==1 {for (i=1; i<=NF; i++) if ($i==c) break} {print $i}' "$2"
}

使用它像:

proj C-8 table.txt

如果您希望传入表中不存在的列名,则应检查:add i!=NF+1 之前 {print $i},否则你将获得与表格行数一样多的空行。

您也可以使用函数将其放在单独的文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.