Dengan GNU awk (gawk
) Anda dapat menggunakan BEGINFILE
aturan untuk membaca pola baru setiap kali file masukan berubah:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Anda harus benar-benar memeriksa getline
itu mengembalikan pola baru, misalnya
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Perhatikan bahwa awk
pola diperpanjang ekspresi reguler, serupa dengan yang didukung oleh grep
dengan -E
opsi.
Anda dapat mencapai hal yang sama di awk
non-GNU dengan meneruskan search.patterns
sebagai file pertama dan menggunakan NR
dan FNR
dengan tepat untuk membaca pola ke dalam larik terindeks, atau mencari pola berikutnya dalam larik.
Menggunakan bash
:
#!/bin/bash
files=( 'file 1.txt' 'file 2.txt' 'file 3.txt' )
while IFS= read -r pattern; do
grep -e "$pattern" "${files[0]}"
files=( "${files[@]:1}" )
done <search.patterns
Mengujinya:
$ bash script.sh
home 3
dog 1
cat 4
Skrip menyimpan nama file yang relevan di files
array, dan kemudian mulai membaca pola dari search.patterns
mengajukan. Untuk setiap pola, file pertama di files
daftar diminta. File yang diproses kemudian dihapus dari files
list (menghasilkan nama file pertama yang baru dalam daftar).
Jika jumlah pola melebihi jumlah file di files
, akan ada error dari grep
.
Anda bisa menggunakan paste
untuk mencocokkan pola dengan file:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Saya berasumsi bahwa nama file tidak mengandung tab.