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

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

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

|Sr|Fruits|Colors|
|1 |apple |red|
|2 |orange |orange
|3 |grapes |purple|

这里很明显使用的awk$2“水果”和$3“颜色”列。

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

IE颜色$3并且水果$2

答案1

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

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

答案2

你可以试试:

$ 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

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

答案3

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

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

输出:

1
2 Sr
3 Fruits
4 Colors
5

答案4

另一种可能性是将字段分隔符|视为记录分隔符,然后处理第一行。

在 colnum.awk 中:

BEGIN {
  RS = "|" 
}
/^Fruits$|^Colors$/ {
  print $0, NR - 1
}
$ head -n1 fruits.txt | awk -f colnum.awk
Fruits 2
Colors 3

相关内容