Grep для нескольких файлов каждый раз перенаправляется на другое имя файла

Добавление моего комментария в качестве ответа, так как он ответил на ваш вопрос.

Думаю, у вас должна быть возможность загрузить архив и скомпилировать его из исходников, если это необходимо. Tarball находится по адресуhttps://ftp.gnu.org/gnu/gcc/gcc-7.1.0/

Загрузите архив, затем запустите обычный ./configure, make,make install

11
07.11.2019, 19:39
4 ответа

Обязательный вариант POSIX sh:

#! /bin/sh -
ret=0
for file in [[:digit:]][[:digit:]][[:digit:]][[:digit:]]-QTR[1234].tsv; do
  base=${file%.tsv}
  grep 8-K < "$file" > "${base%%-*}Q${base##*-QTR}".txt || ret=$?
done
exit "$ret"
5
27.01.2020, 19:57

Другой вариант

for f in  200{8..9}-QTR{1..4}.tsv; do
    grep "pattern" $f > $(sed "s/[-RTtsv]*//g" <<< $f)txt;
done

Пошаговое руководство :Настройте расширение, создающее список имен ваших файлов

200{8..9}-QTR{1..4}.tsv

расширяется до

2008-QTR1.tsv 2008-QTR2.tsv 2008-QTR3.tsv 2008-QTR4.tsv 2009-QTR1.tsv 2009-QTR2.tsv 2009-QTR3.tsv 2009-QTR4.tsv

и делать каждый год и квартал до настоящего времени будет

20{08..19}-QTR{1..4}.tsv

Переберите список for..do..done, извлеките искомый шаблон из файла

grep "pattern" $f

и перенаправить на новое имя файла, сформированное путем удаления нежелательных символов с помощью sedи добавления суффикса txt

$(sed "s/[-RTtsv]*//g" <<< $f)txt

или

$(sed "s/[-RT]*//g" <<< ${f%%.*}.txt)
2
27.01.2020, 19:57

Если вы хотите избежать явного цикла, существует следующее решение. Возможно, кто-то сможет улучшить его. Это выглядит примерно так.

ls -1 *.tsv | xargs -n1 -I'{}' bash -c 'f="{}";grep 8-K $f > ${f//[^0-9Q]/}.txt'
  1. ls просто перечисляет файлы, которые вы хотите обработать
  2. xargs обрабатывает каждый из этих файлов по одному(-n1)
  3. запускается оболочка bash для обработки строк (см. пункт 5)
  4. Устанавливает имя файла в переменную $f
  5. ${f//[^0 -9Q]/} удаляет все символы, которые вам не нужны, в именах файлов.txt (, так что это зависит от вашего примера)

Плюсы :-Простой однослойный

Минусы :-Процесс bash запускается для каждого обрабатываемого файла

Возможно, есть подобное решение без использования bash, но я не знаю ни одного (например, eval не должен работать в этом контексте)

0
27.01.2020, 19:57

В ksh93/bash/zsh, с простым циклом forи расширением параметров:

for f in *-QTR*.tsv
do 
  grep 8-K < "$f" > "${f:0:4}"Q"${f:8:1}".txt
done

Это запускает grepпо одному файлу за раз (, где этот список файлов генерируется из шаблона подстановочных знаков, который требует присутствия «-QTR» в имени файла, а также «.tsv» заканчивается именем файла ), перенаправляя вывод на тщательно -созданное имя файла на основе:

  • первые четыре символа имени файла --год
  • письмоQ
  • 9-й символ имени файла --квартал
12
27.01.2020, 19:57

Теги

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