일치하는 추가 열 데이터를 기반으로 디렉터리 이름 바꾸기

일치하는 추가 열 데이터를 기반으로 디렉터리 이름 바꾸기

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_ABC12개씩 에 전달합니다 .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

관련 정보