2017-12-24 23 views
0

を指定します使用正規表現は、私は一部のカラムだけを必要とする多くのファイルとフォルダを持っている出力ファイル名

mkdir ./raw_data/selection 

doit() { 
    csvfix read_dsv -f 1,3,7 -s \; $1 > $1 | sed 's/raw_data/raw_data\/selection/' 
} 
export -f doit 
Files_To_Parse=`ls ./raw_data/*csv` 
parallel doit ::: $Files_To_Parse 

これは動作しません。

しかし、私の場合これに:

cd ./raw_data 
doit() { 
    csvfix read_dsv -f 1,3,7 -s \; $1 > selection/$1 
} 
export -f doit 
Files_To_Parse=`ls -1 *csv` 
parallel doit ::: $Files_To_Parse 

それは動作しますが、私はこのプロジェクトでトップフォルダからこれを実行できるようにしたいと思います(つまりbrief_csv.shとそれを呼び出すという名前のファイルにこれを入れて

+0

あなたは "を持っていないということ誤植です最初の試行でlsコマンドの "-1"オプションを使用しますか?私はそれが必要であると期待します。あなたの主な問題は、これがBashの場合、 "$ 1> ./raw_data/selection/${1:9}"を試してみましたか?そうでなければ、おそらく "$ 1> $(echo $ 1 | sed '/ raw_data/raw_data \/selection /')"? – EdmCoff

+0

'ls'はパイプへの書き込みを知り、' -1'動作を自動的に有効にします。このオプションは、インタアクティブセッションで出力がどのように見えるかを確認する場合にのみ必要です。 – tripleee

+0

とにかく、scripsで 'ls'を使わないでください。 http://mywiki.wooledge.org/ParsingLsこれを行う正しい方法は単に 'parallel doit ::: * csv'です – tripleee

答えて

1

あなたがバッシュを使用した場合は、可能性:cutあなたが使用できる列を抽出する代わりにcsvfixのも

for f in raw_data/*.csv 
do 
    csvfix ... "$f" > raw_data/selection/"${f##*/}" 
done 

、:

$ cut -d \; -f 1,3,7 $f ... 
1

)のIDEから、私はあなたが使用しているコマンドが、このラインを知らない:

csvfix read_dsv -f 1,3,7- -s \; $ 1> $ 1 | ...

あなたが読んでいるのと同じファイルに出力をリダイレクトします。これは動作しません。実際には、変更されたコードが代わりに機能すると言います。中間結果を保存するために一時ファイルを使用することができます。それらの多くを使用することを恐れることはありません。デバッグはより簡単になり(中間のパスを見ることができます)、システムには影響しません。/tmpは中間ファイルを置くのに適しています。

最初の手順を実行するにはcsvfixを使用し、/ tmp/my-csvfix-intermediateにリダイレクトします。 sedを使って/ tmp/my-csvfix-intermediateを読み込み、/ tmp/my-grep-intermediateに書き込みます。最後の継承の後、おそらく最後の中間結果を取得し、元のファイルを上書きすることができます。おそらくそれをバックアップした後です。必要な場所にファイルを移動することができます。IDEからスクリプトを実行する際に問題はありません。必要な数だけ使用してください。

デバッグ時に並列化しないでください。スクリプトが動作するときに、並列化を追加できます。

2つ以上の並列プロセスが同じファイル(/tmp/my-...-intermediate)に書き込もうとすると、もう1つ問題が発生します。これを克服するには、すべてのプロセスに異なるファイルを使用する必要があります。 bash変数 "$$"は、 "/ tmp/my - $$ - blablabla"のようなファイル名を使用するだけで、$$はプロセスのPIDで置き換えられ、並列プロセスは同じPIDを持つことはできません。

お手数ですが、ご安心ください。

関連する問題