在awk中匹配无视空白区域

时间:2011-03-10 21:24:07

标签: bash awk

 1 #!/bin/bash
 2 KEY_FILE="keys"
 3 TABLE_FILE="table" #pipe delimited data
 4 
 5 i=0;
 6 while read key #print out rows in table file with key in keys file
 7 do
 8   let i=i+1
 9   # key is first column in table
10   # print status to stderr
11   (echo "$KEY_FILE : line $i" >&2)
12   awk -F '|' "\$1 == $key {print \$0}" $TABLE_FILE
13 done < $KEY_FILE
14 

如果存在空格差异,从第12行开始,awk会将第一列与键匹配吗?

1 个答案:

答案 0 :(得分:2)

不,因为您设置了字段分隔符。空白字符现在很重要。

您可以将字段分隔符设置为正则表达式以填充空格。另外,将shell变量的值传递给awk变量以避免引用地狱。

gawk --posix -F '[[:space:]]*\|[[:space:]]*' -v k=$key '$1 == k' $TABLE_FILE

请注意{print $0}是默认操作,因此可以省略。

另外,awk可以处理两个文件,因此你不需要bash循环:

gawk --posix -F '[[:space:]]*\|[[:space:]]*' '
  NR == FNR {key[$1] = ""; next}
  ($1 in key)
' $KEY_FILE $TABLE_FILE

表达式NR == FNR表示awk正在查看文件列表中的第一个文件(NR是“总记录号”,FNR是当前文件的记录号:它们只是相同的为第一个文件)。此程序将密钥保存在key数组中,并打印表文件中具有该数组中密钥的记录。