假设我有一个管道分隔文件,如:
|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
其添加到与原始列号相对应的行号。
你可以试试:
$ 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)