一致する追加の列データに基づいてディレクトリの名前を変更する

一致する追加の列データに基づいてディレクトリの名前を変更する

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 で区切られたレコードを印刷し、一度11111111_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 --

(ここでは、最初のフィールドがすでに表示されている行をスキップします。)

おすすめ記事