Awk был разработан для этого (здесь с GNU awk
для захвата скобок совпавших шаблонов в массив в match()
):
$ awk '
NR == FNR { Ids[$1]++; next; }
match($1, /id=([^;]+);/, Id) && Id[1] in Ids
' /file1 /file2
id=ram;*between*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
Несколько альтернативных ответов предлагают решения, которые делают различные предположения о вводе, которые не совсем очевидны в примере, приведенном OP. Однако одно ясно: в данных есть законное слово, следующее за id=xxx;
, поэтому небезопасно предполагать, что один из идентификаторов из файла 1
не может быть где-то в данных.
Вот почему Awk намного лучше, чем fgrep(1)
. Awk разобьет входные данные на поля, которые могут ограничить возможное совпадение, что и было сделано в приведенном примере, указав, что совпадение должно быть в первом поле ($1
).
В приведенном примере некоторые данные находятся рядом с идентификатором, поэтому, если бы вы хотели абсолютно надежный способ сопоставления идентификаторов в File 1
, вы могли бы определить разделитель полей (FS
) как ;
и печатать только в случае точного совпадения.
Предположим, что файл 2
содержит:
id=ram;*between*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
id=notinlist;jhdjfkhg**kjdfkjksfdjk ram*dfkjskdfjkljdflkjsdflj
id=notinlist;*between*taikah*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
Тогда следующее решение будет работать
$ awk -v FS=";" '
NR == FNR {Id = "id=" $0; Ids[Id]++; next; }
$1 in Ids
' /file1 /file2
id=ram;*between*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
Обратите внимание, что другое решение Awk будет очень медленным для больших файлов, поскольку оно O(N2). Версия sed
будет работать, но лично я считаю sed
нечитабельным для простых смертных.
Вы уже ограничены 4 ГБ памяти; вот что означает значение «4096» в выводе free -m
. Ваш график, без сомнения, также учитывает своп, поэтому, когда вы видите, что использование памяти превышает 4 ГБ, это потому, что сумма используемой памяти и свопа превышает 4 ГБ. (Либо так, либо используются степени 10, а не степени 2.)