#bash #awk
#bash #awk
Вопрос:
Я пытаюсь использовать awk
для создания подкаталогов в каталоге (который всегда является последней строкой file1
, каждый блок разделен пустой строкой), если номер в строке 2 (всегда первые 6 цифр в формате xx-xxxx) file2
находится в $2
of file1
.
Каталог уже будет создан в /path/to/directory
. В приведенном ниже примере каталог Directory2_2
уже существует в /path/to/directory
, и поскольку 19-0003
, 19-0004
и 19-0005
находятся в $2
of file1
, они перемещаются в Directory2_2
.
файл1
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
for f in $(awk { print cut -d'_' -f1 }' file2); do
[[ "$f" == $2 ]] amp;amp; 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
Ответ №1:
Если имена каталогов не содержат пробелов (ниже файл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
Ответ №2:
Не могли бы вы, пожалуйста, попробовать следующее.
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- Он проверит, присутствуют ли во Input_file2 все строки, предшествующие Directory_...
(пункт за пунктом) ключевому слову из Input_file1, если да, то он напечатает выходные данные этих строк вместе с именем каталога он также запишет код на консоль (код 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
etc в конце awk
кода, я его не тестировал. Пожалуйста, НЕ запускайте код без тестирования. Инструкции очень просты, вы можете просмотреть их и должны протестировать это только в тестовом каталоге / тестовой среде.
Комментарии:
1. Спасибо вам обоим :).