выберите данные на основе значения поля

227
Gigiux

У меня есть файл с несколькими записями, предоставляющими идентификаторы, и другой файл с другими записями, разделенными на разные поля, разделенные вкладкой. Мне нужно выбрать записи второго файла на основе сопоставления значения первого файла. Я видел в Интернете, что AWK - правильный инструмент (хотя, вероятно, GREP проще), но я не получаю никакого вывода.

В этом примере я использовал массивы чаще, чем файлы, но для использования awk мне пришлось создать временный файл. По сути, мне нужно сопоставить 3-е поле второго файла (var2) со значением, указанным в первом файле (var1). Форма выбора var2 должна выглядеть так: «shameText \ t someWhat \ t beta \ t thats», из которой я печатаю только первое поле, поэтому на выходе должно быть просто: «shameText». Возможно, я пропустил правильный способ назначения массивов, но в любом случае этот пример - просто прокси для реального соответствия файлов.

Вопрос заключается в следующем: как выбрать строку (запись) или одно поле на основе соответствия между полем и значением переменной?

Пример:

var1="alpha beta gamma delta epsilon" var2=" 'someText somethingElse zeta someMore' 'sameText someElse kappa andMore' 'shameText someWhat beta thatIs' 'shortText moreElse theta andMore'" echo $var2 > tempFile for i in $var1 do printf "i is: %s\n" $i awk -F\t '$3 == "$i" ' tempFile echo "next item" done rm tempFile 
0
Если я правильно понял, вы хотите найти строки в `var2`, третье поле которого является одним из слов в списке` var1`, а затем вывести только первое поле из этих строк `grep -f <(tr '' '\ п» Paulo 6 лет назад 0
(Я должен был опубликовать этот комментарий раньше) Ваш код работает, но есть некоторые исправления. В `echo $ var2> tempfile` $ var2 должен быть заключен в двойные кавычки для сохранения вкладок и новых строк` echo "$ var2"> tempfile`. В строке awk параметр -F устанавливать не нужно, разделители awk по умолчанию пустые и табуляция, а переменная `$ i` должна быть открыта для оболочки` awk '$ 3 == "' $ i '" 'tempFile` Обратите внимание, что внутри команды awk есть двойные кавычки. Paulo 6 лет назад 0

1 ответ на вопрос

0
Paulo

Более простым awkрешением может быть сравнение $ 3 с регулярным выражением.

awk '$3 ~ /alpha|beta|gamma|delta|epsilon/ ' tempFile

Передав список как $var1

awk '$3 ~ /'"$"'/ ' tempFile

Если $ var1 - файл, вы можете передать его в awk с помощью cat

awk '$3 ~ /'"$(cat IDs|tr ' ' '|')"'/ ' tempFile

Спасибо, Пауло, я всегда путаюсь с цитатами Баша. Второе решение, которое вы мне даете, работает просто отлично. Но, в конце концов, я думаю, что grep проще. Gigiux 6 лет назад 0
для протокола, основная проблема с моими реальными данными заключалась в том, что я экспортировал их из windows в linux. Мне нужно было сделать: r -d '\ r' <file_dos> file_linux, чтобы команда grep работала. Gigiux 6 лет назад 0