在awk中使用字符串确定列号

abh*_*air 16 bash awk

假设我有一个管道分隔文件,如:

|Sr|Fruits|Colors|
|1 |apple |red|
|2 |orange |orange
|3 |grapes |purple|
Run Code Online (Sandbox Code Playgroud)

在这里很明显使用awk它,$2是水果,$3是颜色列。

将来如果列的顺序发生变化,是否可以使用字符串确定列号?

颜色$3水果$2

小智 15

感觉有点笨拙,但我总是使用以下代码行找到列号:

head -1 file | sed 's/delimiter/\n/g' | nl
Run Code Online (Sandbox Code Playgroud) 在这里,我获取文件的标题行并将其通过管道sed替换为 \n 的分隔符。结果是每个列标题现在都在一个新行上。最后,我通过管道将nl其添加到与原始列号相对应的行号。

  • 只要您使用`sed`,您就可以删除`head`并执行`sed 's/|/\n/g;q' file | nl`(甚至更短)。另外,考虑使用“nl -ba”对空白行(字段)进行编号。 (2认同)

cuo*_*glm 9

你可以试试:

$ awk -F'|' '
{
  for(i=1;i<=NF;i++) {
    if($i == "Fruits")
      printf("Column %d is Fruits\n", i-1)
    if($i == "Colors")
      printf("Column %d is Colors\n", i-1)
  }
  exit 0
}
' file
Column 2 is Fruits
Column 3 is Colors
Run Code Online (Sandbox Code Playgroud)

请注意,水果颜色的实际列是$3$4


小智 6

也许最好打印第一行中存在的所有列,以便不仅检查这两个字段,还检测新列、它们的名称、顺序更改等。

awk -F'|' ' { for (i = 1; i <= NF; ++i) print i, $i; exit } ' file
Run Code Online (Sandbox Code Playgroud)

输出:

1
2 Sr
3 Fruits
4 Colors
5
Run Code Online (Sandbox Code Playgroud)