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会将第一列与键匹配吗?
答案 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
数组中,并打印表文件中具有该数组中密钥的记录。