как добавить начало файла в другой файл с помощью цикла

#bash #grep

#удар #grep

Вопрос:

У меня есть файлы 1.txt, 2.txt, 3.txt и 1-bis.txt, 2-bis.txt, 3-bis.txt

 cat 1.txt #ok #5  6  5  cat 2.txt #not ok #56 13 56  cat 3.txt #nothing #  cat 1-bis.txt 5 4  cat 2-bis.txt 32 24  cat 3-bis.txt  

Я хотел бы добавить строки, начинающиеся с # (из файлов, отличных от bis), в начале файлов «bis», чтобы получить:

 cat 1-bis.txt #ok #5 5 4  cat 2-bis.txt #not ok #56 32 24  cat 3-bis.txt #nothing #  

Я думал использовать grep -P "#" для выбора строк с # (или, может sed -n быть), но я не знаю, как зациклить файлы, чтобы решить эту проблему

Большое вам спасибо за вашу помощь

Ответ №1:

Вы можете использовать это решение:

 for f in *-bis.txt; do  { grep '^#' "${f//-bis}"; cat "$f"; } gt; "$f.tmp" amp;amp; mv "$f.tmp" "$f" done  

Если вам нужны только # строки в начале файлов, используйте:

Изменить

 grep '^#' "${f//-bis}"  

с:

 awk '!/^#/{exit}1' "${f//-bis}"  

Комментарии:

1. Это добавит все строки , начинающиеся с # , даже если их нет в преамбуле N.txt файла. Если это не то, что нужно оператору , вместо grep '^#' этого мы могли бы использовать awk '!/^#/{exit}1' , чтобы выбрать только первые строки N.txt , начиная с # которых .

2. @RenaudPacalet: Может быть, я неправильно понял, но ОП написал это: I would like to add lines starting with # (from non bis files) at the beginning of files "bis" именно это я и сделал в своем ответе.

3. @anubhava Абсолютно, вы прекрасно ответили на вопрос (причина, по которой я проголосовал). Но поскольку во всех приведенных примерах есть # строки в начале файлов, возможно, эта дополнительная функция также требуется, и оператор забыл упомянуть об этом. Вот почему я прокомментировал это на всякий случай.

4. Да, спасибо @RenaudPacalet, я добавил хорошее awk решение в свой ответ, как вы предложили.

Ответ №2:

Вы можете перебирать ?.txt файлы и использовать расширение параметров для получения соответствующего bis — имени файла:

 for file in ?.txt ; do  bis=${file%.txt}-bis.txt  grep '^#' "$file" gt; tmp  cat "$bis" gt;gt; tmp  mv tmp "$bis" done  

Вам это не нужно grep -P , достаточно простого grep. Просто добавьте ^ , чтобы совпадали только октоторпы в начале строки.