Матч в awk независимо от пробелов - PullRequest
2 голосов
/ 11 марта 2011
 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 Ответ

2 голосов
/ 11 марта 2011

Нет, потому что вы установили свой разделитель полей.Символы пробела теперь имеют большое значение.

Вы можете установить в качестве разделителя полей регулярное выражение для удаления пробелов.Кроме того, передайте значение переменной оболочки в переменную 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 и печатает записи в файле таблицы, которые имеют ключ в этом массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...