根据匹配和附加列数据重命名目录

根据匹配和附加列数据重命名目录

我想根据 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,ABC1xargsmv -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

相关内容