Цикл Bash для создания каталога, если в файле найден числовой идентификатор - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь использовать awk для создания подкаталогов в каталоге (который всегда является последней строкой file1, каждый блок отделен пустой строкой), если число в строке 2 (всегдапервые 6 цифр в формате xx-xxxx) file2 находятся в $2 из file1.

Каталог будет уже создан в /path/to/directory.В приведенном ниже примере Directory2_2 уже существует в /path/to/directory, и поскольку 19-0003, 19-0004 и 19-0005 находятся в $2 из file1, они перемещаются в Directory2_2.

file1

xxxx_006 19-0000_Lname-yyyy-zzzzz
xxxx_007 19-0001_Lname-yyyy-zzzzz
Directory1_1

xxxx_008 19-0003_Lname-yyyy-zzzzz
xxxx_009 19-0004_Lname-yyyy-zzzzz
xxxx_020 19-0005_Lname-yyyy-zzzzz
Directory2_2

file2

xxxx
19-0003-xxx-xxx-xxx_000-111
yyyy
xxxx
19-0004-xxx-xxx-xxx_000-111
yyyy
xxxx
19-0005-xxx-xxx-xxx_000-111
yyyy

awk в bash для цикла

for f in $(awk { print cut -d'_' -f1 }' file2); do
    [[ "$f" == $2 ]] && mkdir -p "$f" /path/to/directory
done

желаемый выход

Directory2_2
 19-0003-xxx-xxx-xxx_000-111
 19-0004-xxx-xxx-xxx_000-111
 19-0005-xxx-xxx-xxx_000-111

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Если имена каталогов не содержат пробелов (ниже файла1, обработанного в режиме абзаца, и файла2 в режиме строки.):

awk 'NR==FNR { for(i=2; i<NF; i+=2) a[substr($i,1,7)] = $NF; next }
     { k = substr($0, 1, 7) } 
     k in a { cmd = sprintf("mkdir -p %s/%s", a[k], $0); print(cmd); }
' RS= file1 RS='\n' file2
#mkdir -p Directory2_2/19-0003-xxx-xxx-xxx_000-111
#mkdir -p Directory2_2/19-0004-xxx-xxx-xxx_000-111
#mkdir -p Directory2_2/19-0005-xxx-xxx-xxx_000-111

изменить print (cmd) на system (cmd) для фактического запуска команды.

Примечание : если имена каталогов содержат пробелы, вам может потребоваться настроить IFS = '\ n' в следующем порядке:использовать $ NF для базового каталога в file1:

awk 'NR==FNR { for(i=1; i<NF; i++) a[substr($i,index($i," ")+1,7)] = $NF; next }                              
     { k = substr($0, 1, 7) } 
     k in a { cmd = sprintf("mkdir -p \"%s\"/\"%s\"", a[k], $0); print(cmd); }
' FS='\n' RS= file1 RS='\n' file2
0 голосов
/ 05 марта 2019

Не могли бы вы попробовать следующее.

awk -v path_val="/your_path/"  '
FNR==NR{
  if($0 ~ /^[0-9]+/){
      a[substr($0,1,7)]=$0
  }
  next
}
/^Directory/{
  if(count==value){
      print "Directory " $0 " all elements are present." ORS "Going to write shell script code  now..."
      print $0 ORS val
      print "*************************************************"
      print "if [[ -d " path_val $0 " ]]" ORS "then" ORS\
            "    cd " path_val $0 ORS "    mkdir " val ORS\
            "    if [[ $? -eq 0 ]]" ORS "    then" ORS \
            "         echo " s1 "Directories named "\
            val s1 " created successfully in path " path_val\
            "." s1 ORS "    else" ORS "         echo " s1\ 
            "kindly check from your end once seems directories not created." s1\
            ORS "    fi" ORS "else" ORS "    echo " s1\
            "Please check seems base directory " path_val " NOT present itself."\
            s1 ORS "fi"
  }
  count=val=value=""
}
($3 in a){
  val=(val?val OFS a[$3]:a[$3])
  count++
}
/^xxx/{
  value++
}'  Input_file2 FS="[ _]" Input_file1

Объяснение того, что код делает:

1- Код имеет переменную с именем /your_path/ который является вашим базовым путем, где будут создаваться каталоги и т. д.

2 - Он проверит, присутствуют ли все строки, предшествующие ключевому слову Directory_... (para by para) из Input_file1, в Input_file2, если да, то онвыведет вывод этих строк вместе с именем каталога + он также напишет код на консоли (bash-код, который проверяет ваш путь к базовому каталогу, а затем создает соответствующие каталоги внутри базового каталога).На данный момент я просто печатаю его, вы можете либо взять его в файл .ksh (как выходной файл) и запустить его, ИЛИ вы можете добавить | bash в конце этого кода.Я не проверял это, я оставляю это до OP.

Следующим будет вывод:

Directory Directory2_2 all elements are present.
Going to write shell script code  now...
Directory2_2
19-0003-xxx-xxx-xxx_000-111 19-0004-xxx-xxx-xxx_000-111 19-0005-xxx-xxx-xxx_000-111
*************************************************
if [[ -d /your_path/Directory2_2 ]]
then
    cd /your_path/Directory2_2
    mkdir 19-0003-xxx-xxx-xxx_000-111 19-0004-xxx-xxx-xxx_000-111 19-0005-xxx-xxx-xxx_000-111
    if [[ $? -eq 0 ]]
    then
         echo Directories named 19-0003-xxx-xxx-xxx_000-111 19-0004-xxx-xxx-xxx_000-111 19-0005-xxx-xxx-xxx_000-111 created successfully in path /your_path/.
    else
         echo kindly check from your end once seems directories not created.
    fi
else
    echo Please check seems base directory /your_path/ NOT present itself.
fi

PS: Как уже упоминалосьвыше, возьмите финальный код оболочки, который должен создавать каталоги в системе либо в файле output_file, либо запустить его, используя | bash и т. д. в конце кода awk, который я не проверял.Пожалуйста, НЕ запускайте код без тестирования.Заявления очень просты, вы можете пройти их и должны проверить их только в тестовой директории / тестовой среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...