У меня есть следующая команда, которая берет определенную часть файла в текущем каталоге, записывает его во временный файл, получает часть другого файла на один каталог, записывает его во временный файл и затем, наконец, объединяет эти два временных файла в один и выводит его в result:

sed -e '3003,$d' file1 > temp1;sed -n '3,$p' ../otherfile1 > temp2; cat temp1 temp2 > ../result1

Это работает для одного файла, но теперь я хочу сделать это для всего каталога.

Я думал, что использование подстановочного знака в команде sed будет работать:

sed -e '3003,$d' file* > temp1;sed -n '3,$p' ../otherfile* > temp2; cat temp1 temp2 > ../result*

но тогда, конечно, он не знает автоматически, как нумеровать временные файлы и выходной файл.

Как я могу использовать эту команду для всего каталога, выводя уникальный файл результатов для каждой конкатенации?

2 ответа2

2

Делайте это как цикл в оболочке bash, а не передавайте весь список sed.

let "n = 1"
for file in *
do
  sed -e '3003,$d' $file > temp1;sed -n '3,$p' ../$file > temp2; cat temp1 temp2 > ../result${n} ;
  let "n = n + 1"
done
1

Используя подоболочку, можно даже избежать файлов "temp1" и "temp2". Кроме того, если имена файлов содержат пробелы, я склонен использовать "while":

n=1
ls | while read f; do
  ( sed -e '3003,$d' $f && sed -n '3,$p' ../$f ) > ../result${n}
  n=$((n+1))
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .