私は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
...これは、拡張なしでパラメータを渡すことができる不快な操作を避けるために、すべてのパラメータの名前が拡張として明示的に指定されるようにするために少し複雑です。 、次のような実行ファイルを作成する場合./script
POSIX を使用するシステムでは、次のように/bin/sh
呼び出すことができます。
./script ./File_*.bz2
答え2
努力する
while read f
do
bzip2 -dc "$f" |
awk -F '\t' 'BEGIN{OFS=FS} $7 > 50' > "$(basename "$f" .bz2)"
done < list-of-file.txt
- awkはFile_1.tsv.bz2の結果をFile_1.tsvに記録し、File_2、...File_960に記録します。
- あなたが与えたファイルのリスト
list-of-file.txt
> $(basename $f .bz2)
結果はローカルディレクトリに作成されます。
答え3
Bashでは、次のことを試すことができます。
for f in `cat $1`
do
bzip ...
done
これはすべてのシェルで動作するわけではなく、これを達成する他の方法があることは間違いありません。$1
「スクリプトに渡された最初の引数」を意味します。
答え4
#!/bin/bash
while read -r j
do
[ -f "$j" ] &&
bzip2 -dc "$j" |
sed -r '/^([^\t]+\t){6}0*([1-9][0-9]{2,}|[6-9][0-9]|5[1-9])/! d' > "${j%.*}"
done <"$1"