![匹配列标题并使用 awk 打印列的值](https://linux22.com/image/1454282/%E5%8C%B9%E9%85%8D%E5%88%97%E6%A0%87%E9%A2%98%E5%B9%B6%E4%BD%BF%E7%94%A8%20awk%20%E6%89%93%E5%8D%B0%E5%88%97%E7%9A%84%E5%80%BC.png)
我的文件中有列数据。我想编写一个脚本,显示与列标题匹配的列的数据。
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
答案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
答案2
如果没有awk
,您可以使用以下命令:
cut $FILE -f `head -1 $FILE | tr "\t" "\n" | grep -n "^$COLUMNTITLE"'$' | cut -f 1 -d :`
仅当有一列与精确匹配时才有效$COLUMNTITLE
答案3
尝试一下这个:
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
如果您希望传递表中不存在的列名,则应检查:i!=NF+1
在之前添加{print $i}
,否则您将获得与表的行一样多的空行。
您也可以使用函数将其放在单独的文件中。