Удалить строки из файла, в котором нет ключа в другом файле - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть fileA, который содержит несколько строк в форме:

clientId=OW&instructionId=cvv-prod&objectId=abc-123&state=WaitForDecision&workId=123e4567-e89b-12d3-a456-426655440000

У меня есть еще fileB, который содержит список действительных objectId, которые меня интересуют:

abc-123
xyz-456

Есть ли способ сохранить в файле A только строки, для которых идентификатор объекта существует в fileB?Если бы это было в Java, я бы получил список всех objectIds в наборе, а затем в fileA переходил строка за строкой, извлекал objectId и проверял, существует ли он в наборе.Хотите знать, если это можно сделать с помощью сценария Bash.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Вот команда grep, которая делает это:

grep -Ef <(sed 's/^/(^|\&)objectId=/; s/$/(\&|$)/' fileB) fileA

clientId=OW&instructionId=cvv-prod&objectId=abc-123&state=WaitForDecision&workId=123e4567-e89b-12d3-a456-426655440000

Обратите внимание, что sed 's/^/(^|\&)objectId=/; s/$/(\&|$)/' fileB используется в подстановке процесса для создания регулярного выражения проверки строки для каждогострока fileB как эта:

(^|&)objectId=abc-123(&|$)
(^|&)objectId=xyz-456(&|$)
0 голосов
/ 19 сентября 2019

С другим подходом с awk, сделав objectId= ИЛИ & в качестве разделителей полей для fileA, учитывая, что ваши Input_files будут такими же, как только показанные образцы.

awk 'FNR==NR{a[$0];next} ($4 in a)' fileB FS="objectId=|&" fileA


2-е решение: Использование совпадения.

awk '
FNR==NR{
  a[$0]
  next
}
match($0,/objectId=[a-zA-Z]+-[0-9]+/){
  var=substr($0,RSTART+9,RLENGTH-9)
}
var in a
'  fileB fileA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...