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