Cria um diretório para cada linha dentro do arquivo de texto fornecido?

5

Estou tentando escrever um script de shell bash que lerá os dados de um determinado arquivo (como um argumento) e, para cada linha no arquivo, criará um subdiretório no diretório especificado (como argumento) .

O script é denominado studentDir e o arquivo de entrada é denominado studentInfo.txt .
Aqui estão duas linhas:

Sara Smith Freshman Marketing
James Lucas Junior Engineering

Na linha de comando, o usuário deve escrever o nome do script, o nome do arquivo txt e o diretório onde os novos diretórios devem ser armazenados. Eu acho que seria assim:

$ studentDir studentInfo.txt .

O que criará os subdiretórios no diretório atual.

Os diretórios devem ser nomeados LLLLFF .
Por exemplo:

SmitSa
LucaJa

(As outras informações do arquivo de entrada não são necessárias)

Acho que devo usar os nomes que usaria:

DIRNAME=$(cut -d' ' -f2 | cut -c1-4 ; cut -d' ' -f1 | cut -c1-2) 
mkdir "$DIRNAME" 

Mas não sei qual comando criaria um diretório para cada linha e como eu poderia fazer isso de forma recursiva para cada um.

    
por Lacey 21.04.2014 / 06:09

3 respostas

6

solução awk

awk '{print substr($2,1,4) substr($1,1,2)}' file

fornece os nomes dos diretórios.

mkdir $(awk '{print substr($2,1,4) substr($1,1,2)}' file)

cria os diretórios (se não forem muitos). Para números enormes (mais de 10.000), você pode usar:

awk '{print substr($2,1,4) substr($1,1,2)}' file | xargs --delimiter=\n mkdir

solução bash

awk não é necessário, o shell pode fazer isso sozinho:

while read first last rest; do mkdir -p "${last:0:4}${first:0:2}"; done <file
    
por 21.04.2014 / 06:16
1

Você pode usar perl . Dizendo:

perl -lanE 'mkdir substr(@F[1],0,4) . substr(@F[0],0,2)' studentInfo.txt

criaria os diretórios desejados.

    
por 21.04.2014 / 06:35
-1

Tente isto:

arr=($(cut -d ' ' -f1,2 < $*))
mkdir $(for ((i=0;i<${#arr[@]};i=i+2)); do echo ${arr[$i+1]:0:4}${arr[$i]:0:2}; done)

A primeira linha irá criar um array com apenas os 2 primeiros campos da entrada. Cada elemento na matriz terá dois campos (primeiro, último). A segunda linha passará por cada elemento na matriz e substituirá cada campo de acordo com o requisito e criará um novo diretório a partir de cada nova entrada formada.

    
por 03.08.2016 / 17:33