ファイル名が2桁の数字で始まる数百のCSVファイルを含むディレクトリがあります{01..84}
。数百 >> 84 なので、一部のファイル名は同じプレフィックスで始まります。ファイル名が同じプレフィックスで始まるファイルをリンクしたいと思います。これが私が得るものです:
#!/bin/bash
for i in {01..84}; do
#declare array to store files with same prefix
declare -a files=()
echo "Processing $i"
for j in `ls $i*.csv`; do
#add files with same prefix to array
files=("${files[@]}" "$j")
done
#cat first file including header with the rest of the files without the headers
cat < ${files[@]:0:1} <(tail -n+2 ${files[@]:1}) > "$i".csv
done
$i
これまでは大丈夫です... ただし、=22(繰り返し可能なエラー)で途中で停止し、「==> 19XXX.csv <==」(引用符を除く)などの空白行とヘッダーで出力ファイルを汚染します。
スクリプトをクラッシュさせずに各プレフィックスに対してきれいでクリーンなcsvファイルを取得するには、コードで何を変更する必要がありますか?
これらのタスクをより迅速かつ簡単に実行するために呼び出すことができるプリコンパイルされたbashユーティリティはありますか?
ベストアンサー1
#!/bin/bash
for i in {01..84}; do
x=$(printf '%02d' $i)
set -- $x?*.csv
if [ -f "$1" ]; then
cp "$1" $i.csv
shift
if [ -f "$1" ]; then
tail -q -n +2 "$@" >> $x.csv
fi
fi
done
各プレフィックスに対して、そのプレフィックスを含むファイルのリストを引数に設定して、最初の背面に$1
アクセスするために使用できます。
$1
ファイルの場合(与えられたプレフィックスを持つファイルがない場合をキャッチするために)、そのファイルをprefix.csvにコピーします。次に、最初のファイルを移動し、次のファイルもファイルであることを確認して、そのプレフィックスを持つファイルが複数あることを確認します。その場合は、コマンドを使用して各ファイルのヘッダー行をスキップしてtail
prefix.csvに追加します。
引数リストに複数のファイルが渡されると、ヘッダー行自体を抑制するオプションが追加されます-q
。tail
tail
==> 19XXX.csv <==
このオプションは解決策に必要なすべてである可能性がありますが、複雑すぎて-q
コマンドbash
出力などをバッファリングする必要があるため、tail
スクリプトが早期に停止(衝突?)される理由かもしれません。
編集:前にゼロなしで1 2 3 ...に拡張されるようにx=$(printf '%02d' $i)
追加されました。{01..84}