我想根据 CSV 文件列中的匹配信息重命名目录。
例如,csv 文件中重复某些行的列如下所示:
1111,ABC1
1111,ABC1
2222,DFG2
3333,FEG1
3333,FEG1
4444,TTG2
现有目录的名称如下:
1111 2222 3333 4444
我想通过与列匹配1
并附加相应的列2
信息来重命名这些目录。
我阅读的专栏如下:
col1_id=$(awk -F "\"*,\"*" '{print $1}' "$somefile" | sed 1d | awk '!a[$0]++')
col2_id=$(awk -F "\"*,\"*" '{print $2}' "$somefile" | sed 1d | awk '!a[$0]++')
我尝试映射列并附加如下:
cnt=${#col1_id[@]}
for ((i=0;i<cnt;i++));
do
mv "{$col1_id[i]}" "${col1_id[i]}_${col2_id[i]}"
done
但是,我没有得到所需的输出。我的输出目录应该有名称。
1111_ABC1 2222_DFG2 3333_FEG1 4444_TTG2
答案1
使用 GNU 工具,您可以执行以下操作:
<file.csv uniq | gawk -F, '{printf "%s\0%s_%s\0", $1, $1, $2}' |
xargs -r0n2 mv -T --
其中gawk
打印每行输入的 NUL 分隔记录,并1111
一次1111_ABC1
将其中 2 个记录传递给.1111,ABC1
xargs
mv -T --
假设重复的行是相邻的。如果没有,请使用sort -u
代替uniq
或执行重复数据删除gawk
:
<file.csv gawk -F, '!seen[$1]++ {printf "%s\0%s_%s\0", $1, $1, $2}' |
xargs -r0n2 mv -T --
(这里跳过已经看到第一个字段的行)。
答案2
听起来你想做这样的事情(未经测试):
#!/usr/bin/env bash
declare -A map
while IFS=, read -r old new rest_if_any_ignored; do
map["$old"]="$new"
done < file
for old in *; do
if [[ -n "${map[$old]}" ]]; then
new="${map[$old]}"
mv -- "$old" "${old}_${new}"
fi
done