我有一个 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
然后我尝试:
对于 'ls' 中的 IX ; 执行 mv -i `cat ../files.txt` `cat ../dates.txt` ; 完成
但事实并非如此。
我确信如果我不是新手的话这会很简单,但我就是想不通。
例子:
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
是文件夹。
笔记:由于页面格式的原因,我在帖子中使用了单引号'而不是勾号。
答案1
如何根据 CSV 内容移动文件?
概括:循环遍历 CSV 本身并提取文件名和目录字段使用cut
。
我明白你为什么会朝这个方向开始;但是,你可以循环遍历 CSV 文件本身,而不是将文件名和目录拆分成单独的文件。基于此,并将字段编号和 CSV 文件路径等一些内容放入变量中,以防它们在某个时候发生变化,你可以按照以下方式进行操作:
/bin/bash #!/bin/bash # move_csv.sh - 根据 CSV 中的字段移动 XML 文件 文件名字段=3 目标字段=12 csvfile="/Users/amermels/Documents/MERGED/Sling\ Manifest\ 2-17-2017.csv" 读取 csv_line 时;执行 mv "`echo $csv_line | cut -d',' -f$filename_field`" "`echo $csv_line | cut -d',' -f$destination_field`" # 例如 mv "BuyingTheView_SunsetCondoToronto_192543_SLING.xml" "3_5_17" 完成 < $csv文件
(稍微有点快而且有点脏;可能有更多惯用的方法从行中提取字段,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
答案2
在您的示例中,192543,FYI,Buy...,1_...,"2,299",,Yes,2017...,2017...,1_...,3_5_17
第五个字段("2,299"
)中有一个逗号。我猜想,如果此字段少于 1,000,则不会有逗号。因此,只有 11 个字段,而不是 12 个。您可以尝试:
awk -F, '{print $3 " " $NF}' /Users/amermels/Documents/MERGED/Sling\ Manifest\ 2-17-2017.csv | xargs -n 2 mv {} {}