Судя по всему, ваш код извлекает первое поле из списка с разделителями табуляцией -в одном файле, а затем пытается найти эти слова во втором файле.
Вы можете несколько упростить это, не сохраняя список слов в массиве:
cut -f1 /tmp/10218.after | grep -f /dev/stdin /tmp/10218.before
Это позволит извлечь слова из первого файла, а затем передать их непосредственно в grep
в качестве шаблонов, которые будут использоваться при сопоставлении со вторым файлом.
Здесь мы можем сделать несколько оптимизаций. Прежде всего, мы можем убедиться, что список слов содержит только уникальных слов:
cut -f1 /tmp/10218.after | sort -u | grep -f /dev/stdin /tmp/10218.before
Во-вторых, мы можем убедиться, что grep
выполняется сравнение строк вместо сопоставления регулярных выражений:
cut -f1 /tmp/10218.after | sort -u | grep -F -f /dev/stdin /tmp/10218.before
Кроме того, мы, возможно, не хотим, чтобы grep
возвращал совпадения для подстрок (, таких как bee
вbumblebee
):
cut -f1 /tmp/10218.after | sort -u | grep -wF -f /dev/stdin /tmp/10218.before
Мы также могли убедиться, что сопоставляем только слова в первом столбце второго файла, переписав слова как привязанные регулярные выражения (и отбросив-F
):
cut -f1 /tmp/10218.after | sort -u | sed 's/^/^/' | grep -w -f /dev/stdin /tmp/10218.before
Команда sed
просто вставляет ^
в начало каждой строки, так что вместо строки bee
мы получаем регулярное выражение ^bee
.
Или мы можем использовать одну awk
программу, которая сделает все за нас:
awk -F '\t' 'FNR == NR { words[$1]++; next } words[$1]' /tmp/10218.after /tmp/10218.before
Это считывает первый столбец с разделителями табуляции -первого файла в массив words
как ключи, а затем проверяет слова во втором файле по этим ключам. Если слово во втором файле встречается в качестве ключа, печатается строка из второго файла.
Если вас не волнует порядок вывода, вы также можете использоватьjoin
:
join <( cut -f1 /tmp/10218.after | sort -u -b ) <( sort -b /tmp/10218.before )
Этот конкретный способ написания команды требует оболочки (, такой как bash
), которая знает о подстановках процессов с помощью <(...)
.
В других оболочках:
cut -f1 /tmp/10218.after | sort -u -b -o keys
sort -b -o data /tmp/10218.before
join keys data
Проблема устранена путем перезагрузки. Теперь я чувствую себя глупо