我已经实现了一个在文件中的列中搜索字符串的函数,它运行良好。我想知道如何修改它以搜索字符串的所有列?
awk -v s=$1 -v c=$2 '$c ~ s { print $0 }' $3
谢谢
如果“所有列”表示“整个文件”,则:
grep $string $file
这是修改当前脚本以在两个不同列中搜索两个不同字符串的一种方法示例。您可以将它扩展到您希望的任意数量,但是对于更多的人来说,以另一种方式来做会更有效。
awk -v s1="$1" -v c1="$2" -v s2="$3" -v c2="$4" '$c1 ~ s1 || $c2 ~ s2 { print $0 }' "$5"
如您所见,这种技术无法很好地扩展。
另一种技术将列号和字符串视为一个文件,并且应该可以更好地扩展:
awk 'FNR == NR {strings[++c] = $1; columns[c] = $2; next}
{
for (i = 1; i <= c; i++) {
if ($columns[i] ~ strings[i]) {
print
}
}
}' < <(printf '%s %d\n' "${searches[@]}") inputfile
该数组${searches[@]}
应包含交替的字符串和列号。
有几种填充方法${searches[@]}
。这是一个:
#!/bin/bash
# (this is bash and should precede the AWK above in the script file)
unset searches
for arg in "${@:1:$#-1}"
do
searches+=("$arg")
shift
done
inputfile=$1 # the last remaining argument
# now the AWK stuff goes here
要运行脚本,您可以这样做:
$ ./scriptname foo 3 bar 7 baz 1 filename
awk -v pat="$string" '$0 ~ pat' infile