Как я могу редактировать и объединять несколько совпадающих файлов с помощью одного цикла?

Если я правильно понял ваш вопрос, следующая замена должна делать то, что вы хотите:

%s/\[\[\(\d\+\)\([_ ]\)Week\([_ ]\)\(\d\+\)\]\],\(\s\d\+\w\+.*\)/[[\1\2Week\3\4|Week \4,\5]]/

Обратите внимание, :группы захвата \([_ ]\)сохраняют разделитель (пробел или подчеркивание )для компонентов, которые появляются перед|(разделителем является пробел для строки 5, в то время как подчеркивание используется в строках 8 -13 ).

2
28.02.2021, 12:24
2 ответа

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ :Это ни в коем случае не лучший способ сделать это или по каким-либо меркам лучший подход, но он показывает, как думать об этих типах проблем, если вы просто выполняете один раз что-то вроде этого, это нормально, но никогда не должен использоваться кем-то другим, кроме человека, пишущего сценарии, т.е. НЕ ставьте на компьютер, который используют другие. Основной принцип состоит в том, что большинство работ кажется простым, если разбить их на мельчайшие этапы.

Я оставил все итерации в этом посте, чтобы вы могли увидеть, как очень простые изменения могут изменить результат, и сравнить их. Трудность возникает, когда вам нужно начать тестирование входных данных, ни один из которых не присутствует, то есть код, который сделал бы это чем-то полезным, т.е. добавление ввода для разных имен файлов, добавление нескольких проверок входных аргументов и т. д. Опять же, я повторяю, что это нормально делать такие вещи как одноразовые, но никогда не следует использовать их в качестве полного ответа на что-то, что носит повторяющийся характер.

#!/bin/bash
    
     for n in $(ls -1 doc*.csv);
     do
     cat $n >> combinded$n
     cat pair_$n >> combinded$n
  
     mv combinded$n $(echo combinded$n | sed 's/doc//g')
     done

При этом будут взяты файлы с именами docA.csvи pair_docA.csvи объединены в один файл с именем combinedA.csv, оставив оригиналы нетронутыми. Это будет сделано для всех файлов в каталоге, использующих один и тот же шаблон именования.

ПРИМЕЧАНИЕ. :Это должно выполняться в каталоге, в котором находятся файлы, и файлы должны называться так, как они здесь указаны.

ТЕСТИРОВАНИЕ:

документ _A.csv документ _B.csv пара _docA.csv пара _docB.csv

ВЫХОД:

combindedA.csv combindedB.csv

РЕДАКТИРОВАТЬ :Чтобы ответить на ваш вопрос о выводе всего в один файл, это будет сделано в файл с именемcombinded.csv

#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded.csv
cat pair_$n >> combinded.csv
done

Это выведет в один файл в таком формате:

  • docA.csv
  • пиар _docA.csv
  • docB.csv
  • пара _docB.csv

ЭСТ. до конца файла.

РЕДАКТИРОВАТЬ :Чтобы добавить каталог в качестве входных и выходных данных, становится немного сложнее, вам нужно проверить аргументы, этот скрипт принимает два аргумента: первый — это каталог, содержащий файлы, а второй аргумент — это расположение выходных данных. file оба аргумента ОБЯЗАТЕЛЬНЫ.

  #!/bin/bash

  dir=$1
  out=$2
  cd $1
  for n in $(ls -1 doc*.csv);
  do
  cat $n >> combinded$n
  cat pair_$n >> combinded$n

  mv combinded$n $out/$(echo combinded$n | sed 's/doc//g')
  done

ПРИМЕР :./script.sh /path/to/files /path/to/output

НЕОБХОДИМЫ ОБА АРГУМЕНТА

1
18.03.2021, 22:28
set -x
DIR=/path/to/file/location
TMPDIR=$(mktemp -d)
rm -f -- "$DIR/combined.csv"

for file in "$DIR"/doc?.csv
do

doc=${file##*/}

#------------ doc processing
temp_doc="$TMPDIR/$doc"

your_code "$file"  > "$temp_doc"

#------------- pair doc processing
pair="$DIR/pair_$doc"
temp_pair="$TMPDIR/$pair"

your_code  "$pair" >  "$temp_pair"


#--------- combine doc+pair
combined="$DIR/combined${doc/doc/}"

your_code "$temp_doc"  "$temp_pair"  > "$combined"
 

cat "$combined" >> "$DIR/combined.csv"
done

Примечание :замените свои коды обработки в трех шагах выше

  • документ=${файл ##*/} Вышеупомянутая конструкция удаляет до последней / начиная слева в переменной оболочки $file. Помните, что у него есть головная часть $DIR. Нам просто нужно простое базовое имя для этого и сохранить результат в другой переменной оболочки $doc.

  • Чтобы объединить все в один файл, я добавил последнюю строку cat.

4
18.03.2021, 22:28

Теги

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