1

У меня есть файл CSV, запятая. Мне нужно переместить файл, указанный в столбце 3, в папку, указанную в столбце 12. Я вывожу оба столбца в разные текстовые файлы, используя:

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

Тогда я попробовал:

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

Но так просто не работает.

Я уверен, что это было бы просто, если бы я был больше, чем новичок, но я просто не могу понять это.

Пример:

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 - это файл, а 3_5_17 - это папка.

ПРИМЕЧАНИЕ: я использовал одинарную кавычку вместо галочки в своем посте из-за форматирования страницы.

2 ответа2

2

Как я могу переместить файлы на основе контента CSV?

Описание: зациклите сам CSV и извлеките поля имени файла и каталога, используя cut .

Я понимаю, почему вы начали в том же направлении, что и вы; но вместо того, чтобы разбивать имя файла и каталог на отдельные файлы, вы можете зациклить сам файл CSV. Исходя из этого, и помещая несколько переменных, таких как номера полей и путь к файлу CSV, в переменные на случай, если они изменятся в какой-то момент, вы можете сделать что-то вроде следующего:

#!/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

(немного быстрый и грязный; вероятно, есть более идиоматические способы извлечения полей из строки для mv , чем использование двух отдельных подпроцессов и вызовов cut , но это по крайней мере работает в моем быстром тесте)

Пример «вывода» (на основе составленных данных, схожих по формату с тем, что вы имеете)

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"

(Это на самом деле не вывод; это команды mv , которые будут выполняться, когда скрипт просматривает CSV.)

Внимание: обратите внимание на каталог, в котором работает этот скрипт! Предполагается, что файлы XML существуют в рабочем каталоге (из которого выполняется скрипт), а подкаталоги уже существуют. Если это не так, добавление cd в правильный рабочий каталог или использование базового каталога для добавления путей в команду mv относительно тривиально.

0

В вашем примере, 192543,FYI,Buy...,1_...,"2,299",,Yes,2017...,2017...,1_...,3_5_17 пятое поле ("2,299") имеет запятая в нем. Я предполагаю, что если это поле меньше 1000, запятых не будет. Поэтому только 11 полей вместо 12. Вы можете попробовать:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .