可変数のCSVを連結してヘッダー行を削除する方法は?

可変数のCSVを連結してヘッダー行を削除する方法は?

ファイル名が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 <==」(引用符を除く)などの空白行とヘッダーで出力ファイルを汚染します。

  1. スクリプトをクラッシュさせずに各プレフィックスに対してきれいでクリーンなcsvファイルを取得するには、コードで何を変更する必要がありますか?

  2. これらのタスクをより迅速かつ簡単に実行するために呼び出すことができるプリコンパイルされた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にコピーします。次に、最初のファイルを移動し、次のファイルもファイルであることを確認して、そのプレフィックスを持つファイルが複数あることを確認します。その場合は、コマンドを使用して各ファイルのヘッダー行をスキップしてtailprefix.csvに追加します。

引数リストに複数のファイルが渡されると、ヘッダー行自体を抑制するオプションが追加されます-qtailtail==> 19XXX.csv <==

このオプションは解決策に必要なすべてである可能性がありますが、複雑すぎて-qコマンドbash出力などをバッファリングする必要があるため、tailスクリプトが早期に停止(衝突?)される理由かもしれません。

編集:前にゼロなしで1 2 3 ...に拡張されるようにx=$(printf '%02d' $i)追加されました。{01..84}

おすすめ記事