Терминал xfce игнорирует установленную оболочку по умолчанию

Судя по всему, ваш код извлекает первое поле из списка с разделителями табуляцией -в одном файле, а затем пытается найти эти слова во втором файле.

Вы можете несколько упростить это, не сохраняя список слов в массиве:

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
0
20.03.2021, 21:33
1 ответ

Проблема устранена путем перезагрузки. Теперь я чувствую себя глупо

1
28.04.2021, 22:58

Теги

Похожие вопросы