Como mover arquivos para pastas específicas com base em entradas CSV?

1

Eu tenho um arquivo CSV com vírgula delineada. Eu preciso mover o arquivo, listado na coluna 3 para a pasta listada na coluna 12. Eu envio ambas as colunas para diferentes arquivos de texto usando:

awk -F ',' '{print $3}' /Users/amermels/Documents/MERGED/Sling\ Manifest\ 2-17-2017.csv > ../files.txt

awk -F ',' '{print $12}' /Users/amermels/Documents/MERGED/Sling\ Manifest\ 2-17-2017.csv > ../dates.txt

Então eu tentei:

for IX in 'ls' ; do mv -i 'cat ../files.txt' 'cat ../dates.txt' ; done

Mas isso não funciona dessa maneira.

Tenho certeza de que isso seria simples se eu fosse mais do que um novato, mas não consigo entender isso.

Exemplo:

192543,FYI,BuyingTheView_SunsetCondoToronto_192543_SLING.xml,1_27_17 16:32,"2,299",,Yes,2017-01-30,2017-03-05,1_30_17,3_5_17

BuyingTheView_SunsetCondoToronto_192543_SLING.xml é o arquivo e 3_5_17 é a pasta.

OBSERVAÇÃO : usei aspas simples em vez de marcar minha postagem devido à formatação da página.

    
por Alex L. Mermelstein 18.02.2017 / 00:57

2 respostas

2

Como posso mover arquivos com base no conteúdo CSV?

Resumo : percorra o próprio CSV e extraia os campos nome do arquivo e diretório usando cut .

Eu posso ver porque você começou na direção que você fez; mas, em vez de dividir o nome do arquivo e o diretório em arquivos separados, você pode fazer um loop pelo próprio arquivo CSV. Com base nisso, e colocando algumas coisas como os números de campo e o caminho do arquivo CSV nas variáveis, caso elas sejam alteradas em algum momento, você poderia fazer algo nos seguintes moldes:

#!/bin/bash
# move_csv.sh - move XML files based on fields in a CSV 

filename_field=3
destination_field=12
csvfile="/Users/amermels/Documents/MERGED/Sling\ Manifest\ 2-17-2017.csv"

while read csv_line; do
    mv "'echo $csv_line | cut -d',' -f$filename_field'" "'echo $csv_line | cut -d',' -f$destination_field'"
    # eg mv "BuyingTheView_SunsetCondoToronto_192543_SLING.xml" "3_5_17"
done < $csvfile

(um pouco rápido e sujo; provavelmente há mais maneiras idiomáticas de extrair os campos da linha para mv em vez de usar dois subprocessos e invocações separadas de cut , mas isso pelo menos funciona no meu teste rápido )

Exemplo 'output' (baseado em dados confeccionados semelhantes em formato ao que você tem):

mv "BuyingTheView_SunsetCondoToronto_192543_SLING.xml" "3_5_17"
mv "BuyingTheView_SunriseCondoToronto_192544_SLING.xml" "3_5_18"
mv "BuyingTheView_LakeviewCondoToronto_192545_SLING.xml" "3_5_18"
mv "BuyingTheView_SunsetCondoVancouver_192546_SLING.xml" "3_5_19"
mv "BuyingTheView_SunsetCondoOttawa_192547_SLING.xml" "3_5_20"
mv "BuyingTheView_SunsetApartmentMontreal_192548_SLING.xml" "3_5_20"

(Isso não é realmente a saída; esses são os comandos mv que seriam executados conforme o script examina o CSV.)

Cuidado : preste atenção em qual diretório este script está operando! Ele supõe que os arquivos XML existam no diretório de trabalho (onde o script está sendo executado) e os subdiretórios já existem. Se esse não for o caso, é relativamente trivial adicionar um cd ao diretório de trabalho correto ou usar um diretório base para adicionar aos caminhos no comando mv

    
por 18.02.2017 / 14:48
0

No seu exemplo, 192543,FYI,Buy...,1_...,"2,299",,Yes,2017...,2017...,1_...,3_5_17 o quinto campo ( "2,299" ) tem uma vírgula. Meu palpite é que, se esse campo for menor que 1.000, não haverá vírgula. Portanto, apenas 11 campos em vez de 12. Você poderia tentar:

awk -F, '{print $3 " " $NF}' /Users/amermels/Documents/MERGED/Sling\ Manifest\ 2-17-2017.csv | xargs -n 2 mv {} {}
    
por 04.05.2017 / 14:42

Tags