Вот решение с использованием Bash:
#!/bin/bash
while read pointer; do
filename="$(echo $pointer | cut -d ' ' -f 1)"
if grep $filename list_file > /dev/null; then
echo $pointer >> output/"$filename".txt
fi
done < data_file
Вот разбивка по строкам:
Строка 3 - это начало используемого цикла while чтобы просмотреть файл_данных.
Строка 4 повторяет строку, прочитанную в текущей итерации. Затем строка передается в cut, который вырезает первую часть строки, используя пробел в качестве разделителя. Затем результат присваивается переменной с именем "filename".
Строка 5 использует команду grep, чтобы определить, существует ли ранее определенное значение в list_file. Если grep удается найти значение (вернуть статус 0), сценарий переходит к строке 6. Если grep ничего не находит (возвращает статус 1), сценарий запускает цикл заново.
Строка 6 отображает всю строку для вывода / "$ filename" .txt.
Строка 7 закрывает оператор if.
Строка 8 закрывает цикл, и на нее ссылаются data_file.
Другие важные примечания:
Решение Тоби Спейта подходит. Немного дополнительной информации:
Обычно это "специальные символы" ansi, используемые для создания цвета, специальных эффектов, позиционирования курсора и т.д. в терминале.
например, grep --color=always '[a-z]*music[a-z]*' files > output
выдаст такие символы.
sed -r "s/\x1B\[[0-9;]*[a-zA-Z]//g"
Предложение: проверьте, не установлена ли у вас GREP_COLOR
deprecated переменная на --color=always
или подобная...
Вы хотите удалить CSI . .. m последовательностей. Зная, что они содержат последовательность чисел, разделенных ;
, вы можете использовать sed для замены каждого вхождения пустой строкой:
esc=$'\e'
sed "s/$esc\[[0-9;]*m//g" a.txt
Я использую синтаксис Bash для написания escape-символа выше.