複数のファイル - awkコマンドフィルタ

複数のファイル - awkコマンドフィルタ

私はfilter1.shにawkコマンドが含まれているというスクリプトを使用します。

bzip2 -dc File_1.tsv.bz2 | awk -F '\t' 'BEGIN {OFS=FS} { if (($7) > 50)  print $0 }'  > File_1.tsv

bzip2 -dc File_2.tsv.bz2 | awk -F '\t' 'BEGIN {OFS=FS} { if (($7) > 50)  print $0 }'  > File_2.tsv

bz2ファイルを開き、列7から50を超える値をフィルタリングし、出力を新しいtsvファイルに書き込みます。

このフィルタリング手順を実行する必要があるいくつかのファイル(約200個、異なるディレクトリにあります)があります(まったく同じですが似ています)。

私の質問は、この目的のために複数のファイルを渡す方法です。別のINFILE(Pythonなど)を介してファイルを渡すことはできますか?

それはまるで。

./filter1.sh pathtofiles.in

コマンドラインから。ここで pathtofiles.in にはファイルの場所が含まれます。

/home/users/gray_wolf/unix/File_1.tsv.bz2
/home/users/gray_wolf/unix/File_2.tsv.bz2
.
.
.
.
.

など。

よろしくお願いします。 〜M

ベストアンサー1

次のように、1つの出力ストリームにすべて入れることができます。

bzip2 -dc ./File_*.bz2 | filter

出力から別々のファイルに書き込むには、何らかの方法でストリームを分離する必要があります。準備ができれば、これは理想的なソリューションになります。詳細については、これを行うのに役立ちます。

それ以外の場合は、各入力ファイルに対してフィルタを1回呼び出すことができます。

for j in ./File_*.bz2
do    [ -f "$j" ] &&
      bzip2 -dc "$j" |
      awk ... >"${j%.*}"
done

各ファイルに対してパイプの新しいインスタンスを呼び出す必要があるため、これは理想的ではありませんが、実用的なソリューションです。

他のスクリプトファイルからこのようなループを取得し、使用したいパラメータを渡すforには、次のようにします。

#!/bin/sh
for j do
      case $j in
      (*.bz2) [ -f "$j" ] &&
              bzip2 -dc --  "$j" |
              awk ...   >"${j.*}"
      esac
done

*.bz2...これは、拡張なしでパラメータを渡すことができる不快な操作を避けるために、すべてのパラメータの名前が拡張として明示的に指定されるようにするために少し複雑です。 、次のような実行ファイルを作成する場合./scriptPOSIX を使用するシステムでは、次のように/bin/sh呼び出すことができます。

./script ./File_*.bz2

おすすめ記事