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