Script Bash para fazer eco da primeira posição de cada linha no arquivo com o nome do segundo

2

Eu tenho um arquivo de texto organizado da seguinte forma:

Group 1
asdsdsdsdf.html  jeff
xcvxcvxcvx.html  bob
vrgeiuvhif.html  sue

Group 2
iwdowijdoi.html  mary
pokpompojm.html  doug
ndkjfsjfbs.html  lisa

Eu preciso de um script bash que crie um diretório com o nome de cada grupo. E, em seguida, um arquivo de texto com o nome de cada pessoa desse grupo com o link correspondente na primeira linha.

Consegui criar os diretórios, os arquivos de texto nomeados e um arquivo apenas com os links. Mas eu não sei como fazer o eco de cada link em cada arquivo de nome ou como classificá-los por grupo.

Tenho certeza de que há maneiras melhores de realizar a pequena quantidade que tenho.

#!/bin/bash

grep Group list.txt > groups
grep -v Group list.txt > links_names
while read file; do mkdir "${file}"; done < groups
while read line; do export name='echo $line | awk '{print $2}''
touch "$name"; done < links_names
while read line; do export link='echo $line | awk '{print $1}''
echo "$link" >> links ; done < links_names

rm {groups,links_names,links}
    
por WiseGuy 14.10.2015 / 23:55

3 respostas

3

com awk :

awk '/^Group/{g=$0; system("mkdir \""g"\""); next} g&&$0{print $1 >g"/"$2}' file
  • /^Group/ se a linha começar com a string Group ...
    • g=$0 defina a variável g para o nome do grupo, por exemplo Group 1 .
    • system(...) chame o comando mkdir com a função do sistema para criar esse diretório (observe as aspas adicionais para lidar com espaços em nomes de grupos).
  • g&&$0 se a variável g estiver definida e a linha não estiver vazia ...
    • print $1 >g"/"$2 escreve o valor no primeiro campo $1 (o link) em um arquivo no diretório g name pelo valor do segundo campo $2 (o nome).

O teste:

$ cat Group\ 2/doug
pokpompojm.html
    
por 15.10.2015 / 00:11
1

Requisitos

I need a bash script that creates a directory named after each group. And then a text file inside named for each person in that group with their corresponding link on the first line.

#!/bin/bash
while read a b
do
    # Skip blank lines
    test -z "$a" && continue

    if [[ "$a" == "Group" ]]
    then
        # Create the group directory
        group_dir="$a $b"
        mkdir "$group_dir"
    else
        # Write the link into the named file
        echo "$a" > "$group_dir/$b"
    fi
done <list.txt

Para os puristas, isso pressupõe uma série de restrições:

  • nenhuma linha no seu arquivo de texto começa com espaço em branco significativo
  • nenhum link contém espaços em branco
  • há precisamente duas palavras por linha separadas por espaço em branco ou que as linhas estão vazias
  • que a primeira linha não vazia é um cabeçalho de grupo

Todas essas suposições podem ser superadas à custa de código adicional (e complexidade).

    
por 15.10.2015 / 00:12
0

Se o seu textfile for estrito, como em seu grupo sempre será chamado de "Group" seguido por um espaço e uma palavra e não terá espaços no nome do grupo, e da mesma forma para os nomes depois de .html, isso deve funcionar .

#!/bin/bash

parseNdostuff(){
    case $1 in
        Group)
            shift
            mkdir $1
            cd $1
            ;;
        *.html)
            link=$1
            shift
            echo $link > $1
            ;;
        *)
            cd ..
            ;;
    esac

}

while read line
do
   parseNdostuff $line
done <  mytext.txt

Basta fazer um while read line e sua entrada de arquivo de texto no final < mytext.txt e alimentá-lo para uma função que eu escrevi. A razão pela qual optei por fazê-lo em uma função foi pela simplicidade de lidar com cada linha, além de ser capaz de usar facilmente maiúsculas e minúsculas.

Alguns detalhes:

$1 é o primeiro argumento da função (as variáveis $ são especiais, procure-as)

shift reduz os argumentos ( $1 é eliminado, $2 torna-se $1 , $3 - > $2 )

quando cria um diretório que cd nesse diretório, então quando a instrução é executada novamente e vê as linhas .html, ele cria os arquivos e insere o link no diretório apropriado.

*) é todos os outros casos, por isso, se você tiver uma linha em branco entre os grupos, será apenas cd .. e irá para um diretório, e você estará de volta onde você começou seu script. Note que todos esses cd's são relativos ao seu posicionamento de script.

    
por 15.10.2015 / 00:41