Нужен сценарий awk или любой другой способ сделать это на Unix - PullRequest
1 голос
/ 03 мая 2011

У меня есть небольшой файл с примерно 50 строками и двумя полями, как показано ниже

file1
-----
12345   8373
65236   7376
82738   2872
..
..
..

У меня есть около 100 файлов, которые разделены запятой ",", как показано ниже:

file2
-----
1,3,4,4,12345,,,23,3,,,2,8373,1,1

каждый файл имеет много строк, похожих на приведенную выше строку.Я хочу извлечь из всех этих 100 файлов, чье 5-е поле равно 1-му полю в первом файле, а 13-е поле равно 2-му полю в первом файле

Я хочу найти все 100 файлов, используя этот единственныйfile?

Я придумал приведенное ниже в случае одного файла, разделенного запятыми. Я даже не уверен, правильно ли это!но у меня есть несколько файлов, разделенных запятыми.

awk -F"\t|," 'FNR==NR{a[$1$2]++;next}($5$13 in a)' file1 file2

Кто-нибудь может мне помочь, пожалуйста?

РЕДАКТИРОВАТЬ: вышеупомянутая команда работает нормально в случае одного файла.

Ответы [ 2 ]

1 голос
/ 03 мая 2011

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

#!/bin/awk -f

FILENAME == "file1" {
    keys[$1] = ""
    keys[$2] = ""
    next
}

{
    split($0, fields, "," )
    if (fields[5] in keys && fields[13] in keys) print "*:",$0
}

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

runit.awk file1 file2

Альтернативой является явное открытие первого файла (используя «open») и чтение его (readline) в блоке BEGIN.

0 голосов
/ 03 мая 2011

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

while read line
do
   f1=$(echo $line | awk '{print $1}')
   f2=$(echo $line | awk '{print $2}')
   awk -v f1="$f1" -v f2="$f2" -F, '$5==f1 && $13==f2' file*
done < small_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...