Awk, чтобы создать каталог, а затем подкаталог с zip в нем - PullRequest
0 голосов
/ 07 марта 2019

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

Если есть совпадение и в каталоге создается подкаталог, то соответствующая строка1 https в файле2 всегда будет ссылкой на zip-файл для загрузки. Я не могу создать эту ссылку в подпапке, скачать и распаковать .zip. код загрузки выполняется и загружает почтовый индекс, но должен быть вручную добавлен в терминал. Я прошу прощения за длинный пост, хотел бы включить все детали, чтобы решить эту проблему

file1

xxx_006 19-0000_xxx-yyy-aaa
xxx_007 19-0001_zzz-bbb-ccc
FolderName_001_001

yyyy_0287 19-0v02-xxx
yyyy_0289 19-0v31-xxxx
yyyy_0293 19-0v05-xxxx
FolderName_002_002

file2

https://xx.yy.zz/path/to/file.zip
19-0v05-xxx_000_001
 cc112233
https://xx.yy.zz/path/to/download/file.zip
19-0v31-xxx-001-000
bb4456784
https://xx.yy.zz/path/to/file.zip
19-0v02-xxx_000_001
aaa331232

awk edit

cmd_fmt='mkdir -p "%s/%s"
# run the awk command
awk -v cmd_fmt="$cmd_fmt" '
# create an associative array (key/value pairs) based on the file1
NR==FNR { for(i=2; i<NF; i+=2) a[substr($i,1,7)] = $NF; next } 

# retrieve the first 7-char of each line in file2 as the key to test 
 against the above hash
{ k = substr($0, 1, 7) }

# if find k, then print
k in a { print a[k] "\t" $0 "\t" l }
# save prev line to 'l' which is supposed to be the URL
{ l = $0  } 
' RS= file1 RS='\n' file2 | while IFS=$'\t' read -r base_dir sub_dir link; 
do
echo "download [$link] to '$base_dir/$sub_dir'"
# bash command lines to make sub-folders and download files
 create the format text used in sprintf() to run the desired shell commands
cd "%s/%s" && curl -O -v -k -X GET %s -H "Content-Type:application/x- www-form-urlencoded" -H "Authorization:xxxx" && { filename="%s"; unzip 
"${filename##*/}"; }'
done

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

FolderName_002_002 --- directory
    19-0v02-xxx_000_001  --- sub folder
    https://xx.yy.zz/path/to/file.zip  --- zip and extracted downloaded to sub-folder
    19-0v05-xxx_000_001  --- sub-folder
    https://xx.yy.zz/path/to/file.zip  --- zip and extracted downloaded to sub-folder
    19-0v31-xxx-001-000  --- sub-folder
    https://xx.yy.zz/path/to/file.zip  --- zip and extracted downloaded to sub-folder

1 Ответ

1 голос
/ 07 марта 2019

Я считаю, что ваш вопрос связан с этим: Цикл Bash для создания каталога, если числовой идентификатор найден в файле

Вы можете запускать все команды в одной функции awk system(),просто организуйте их правильно, например:

# create the format text used in sprintf() to run the desired shell commands
cmd_fmt='mkdir -p "%s/%s" && cd "%s/%s" && curl -O -v -k -X GET %s -H "Content- Type:application/x-www-form-urlencoded" -H "Authorization:xxx" && { filename="%s"; unzip "${filename##*/}" && rm -f "${filename##*/}"; }'

# run the awk command
awk -v cmd_fmt="$cmd_fmt" '
    # create an associative array (key/value pairs) based on the file1
    NR==FNR { for(i=2; i<NF; i+=2) a[substr($i,1,7)] = $NF; next } 

    # retrieve the first 7-char of each line in file2 as the key to test against the above hash
    { k = substr($0, 1, 7) }

    # if find k, then run the system command    
    k in a { cmd = sprintf(cmd_fmt, a[k], $0, a[k], $0, l, l); print(cmd) }

    # save prev line to 'l' which is supposed to be the URL
    { l = $0  } 
' RS= file1 RS='\n' file2

измените print на system для выполнения команды.

Примечание: вышеуказанные команды unzip и rm могут не работать, если имена файлов содержат символы в кодировке URL.

Обновление на основе вашего awk edit:

Вы также можете просто напечатать необходимую информацию из строки awk и затем обработать ее в bash, не нужно делать все в awk (также удалите строку, чтобы определить cmd_fmtв вашем awk edit разделе):

awk '
    # create an associative array (key/value pairs) based on the file1
    NR==FNR { for(i=2; i<NF; i+=2) a[substr($i,1,7)] = $NF; next } 

    # retrieve the first 7-char of each line in file2 as the key to test against the above hash
    { k = substr($0, 1, 7) }

    # if find k, then print
    k in a { print a[k] "\t" $0 "\t" l }

    # save prev line to 'l' which is supposed to be the URL
    { l = $0  } 

' RS= file1 RS='\n' file2 | while IFS=$'\t' read -r base_dir sub_dir link; do
    echo "download [$link] to '$base_dir/$sub_dir'"
    # bash command lines to make sub-folders and download files
    mkdir -p "$base_dir/$sub_dir" 
    cd "$base_dir/$sub_dir"

    if curl -O -v -k -X GET "$link" -H "Content-Type:application/x-www-form-urlencoded" -H "Authorization:xxxx" >/dev/null 2>&1; then
        echo "  + processing $link"
        # remove query_string from the link, since it might contains '/'
        filename="${link%\?*}"
        # remove path from filename and run `unzip`
        unzip "${filename##*/}" 
    else
        echo "  + error downloading: $link"
    fi

    # return to the base directory if it's a relative path
    # if all are absolute paths, then just comment out the following line
    cd ../..
done

Примечание: Я не проверял строку curl и не знаю, какие имена файлов могут быть для разных ссылок.filename="${link##*/}" - удалить все символы до последнего символа '/', в результате чего останутся имя файла и потенциальные строки запроса."${filename%\?*}" - удалить завершающие строки запроса из filename.На самом деле имя файла, загружаемое с помощью вашей команды curl, может отличаться, и вам придется проверять и корректировать его с конца.

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