Использование gawk для извлечения строк со строкой в ​​столбце - PullRequest
1 голос
/ 10 июля 2020

Я пытался извлечь строки из файла, разделенного табуляцией, если он содержал определенное слово в 4-м столбце. Например, если входной файл test.txt имеет вид:

chr     8       1234    abc ; xyz
chr     8       1255    abc
chr     8       987     xyz
chr     8       5467    jxyzm

Следующий код правильно выводит только 1-ю и 3-ю строку:

gawk -F"\t" ' { if($4 ~ /\<xyz\>/) print $0 } ' test.txt >> test.out

Однако, когда я пытаюсь запустить это в al oop, в сценарии bash мой выходной файл пуст. код, который я использую:

while read id
do    
    OFILE=${ODIR}/${id}.txt
    gawk -v id="$id" -F"\t" ' { if($4 ~ /\<id\>/) print $0 } ' ${IFILE} >> ${OFILE}
done < ${GFILE}

В файле $ {GFILE} по одному слову в строке, например:

xyz
fg45
tre2y

Что я делаю не так?

спасибо!

Отредактировано в:

  1. Добавить четвертую строку во входной файл
  2. Добавлен -v id = "$ id" в команду ... скрипт все еще не работает не работает!

1 Ответ

5 голосов
/ 10 июля 2020

Вы можете очень хорошо использовать awk для чтения шаблонов поиска из одного файла и поиска совпадений в другом, например:

awk -F '\t' '
NR == FNR {
   words[$1]
   next
}
{
   for (w in words)
      if (index($4, w)) {
         print > w ".txt"
         break
      }
}' "$GFILE" "$IFILE"

Затем проверьте вывод:

cat xyz.txt
chr     8       1234    abc ; xyz
chr     8       987     xyz

Если вы действительно очень хотите исправить свой сценарий оболочки, то вот он:

while read id; do
    awk -F '\t' -v id="$id" '$4 ~ id' "$IFILE" > "$id.txt"
done < "$GFILE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...