Свяжите файлы в нескольких подкаталогах соответствия

Wiki хакеров удара имеет список функций удара и когда они были представлены: http://wiki.bash-hackers.org/scripting/bashchanges

Этот список не включает замену процесса, таким образом, потребовалось некоторое дальнейшее исследование. В соответствии с этой статьей, которая ссылается на журнал изменений, версия 1.13.5 имела рабочую замену процесса: http://www.quora.com/Which-version-of-bash-added-the-Process-Substitution-feature

Датой на записи журнала изменений является Sun 23 февраля 3:38:59 1992.

2
13.04.2017, 15:36
3 ответа

согласно Вашему примеру, любой каталог, который имеет "дубликаты", имеет дубликат, заканчивающийся в" (1)", таким образом:

for dir in ???\(1\)/; do 
    base=${dir%(*}
    for i in 1 2; do
        f=${base}_S1_L001_R${i}_001.fastq
        echo "mv ${base}/$f ${base}/$f.bak"
        echo "cat ${base}*/${f}* > ${base}/$f"
    done
done

Удалите "эхо" s, когда Вы будете готовы

2
27.01.2020, 22:14
  • 1
    Иногда существует до 4 дубликатов. например, dir, dir (1), dir (2), dir (3) –  Carpe_Noctem 09.10.2013, 17:55
  • 2
    Это должно захватить их всех в cat строка с ${base}* –  glenn jackman 09.10.2013, 18:49

Там бесполезен для любого инструмента обработки текста кроме cat, так как все, что Вы делаете с содержанием файла, должно связать их.

Мы запускаем в RootDir. Я предполагаю, что в NNN (K), K ≤ 999999999, и K записан без продвижения 0. Я создаю шаблоны с ([0-9]), ([0-9][0-9]), и т.д., чтобы связать NNN (9) перед NNN (10).

pattern_prefix='[0-9][0-9][0-9]([1-9]'
while [ ${#pattern_prefix} -le 13 ]; do
  # Iterate over the NNN(K) directory where K has a certain number of digits
  for dir in $pattern_prefix\); do
    if ! [ -d "$dir" ]; then break; fi
    base=${dir%\(*}
    target=$base/$base
    # If this is the first NNN(K) directory we meet for this NNN, create the base
    if [ ! -d "$target" ]; then
      mkdir "$target"
      cp -p "$base/"*.fastq "$target"
    fi
    # For each file in NNN(K), determine the target file and append
    for f in "$dir/"*.fastq; do
      stem=${f##*/}; stem=${f#*_*_}
      set -- "$target/"*_*_"$stem"
      cat "$f" >>"$1"
    done
  done
  pattern_prefix=$pattern_prefix'[0-9]'
done
0
27.01.2020, 22:14
  • 1
    Интересный. Учитывая, что иногда префикс может быть иногда также четырьмя числами с (ограничения) буква, был бы, просто заменив pattern_prefix переменную к' [0-9] [0-9] [0-9] [0-9] [A-Z]...' работа? Я думаю не, поэтому возможно, один сценарий для 3 префиксов числа и другой для четырех префиксов буквы номер один? Я также удалил оператор/теги о awk/sed, потому что Вы корректны об ударе/кошке, являющемся единственными вещами, действительно необходимыми. –  Carpe_Noctem 09.10.2013, 17:49
  • 2
    @Carpe_Noctem Вы могли даже изменить его на pattern_prefix=*\([0-9] если все имена файлов, содержащие открывающую скобку, имеют желаемую форму. –  Gilles 'SO- stop being evil' 09.10.2013, 17:54

Если я понимаю вопрос правильно, Вы хотите что-то вроде этого:

for D in ???
do
  [[ -d $D?* ]] || continue
  mkdir $D/$D
  for F in $D/*
  do
    cat $D*/$F > $D/$D/$F
  done
done

Это не принимает пробелов в каталоге имен файлов, и что все дублированные файлы появятся, по крайней мере, в каталоге с 3 символами. Если у Вас могло бы быть имя файла, которое находится только в 111 (1) каталоги, замена

  for F in $D/*

с

  for F in $( find $D* -printf "%f\n" | sort -u )

таким образом, Вы получите список уникальных имен в 111, 111 (1), и т.д.

0
27.01.2020, 22:14

Теги

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