「for 文」を使用して、複数回繰り返される bash 文を簡素化します。

「for 文」を使用して、複数回繰り返される bash 文を簡素化します。

を介してファイル名をサブセット化し、grep結果ファイルをcatfor ((i=1;i<23;i+=1));

私のファイルが与えられたら、次のようにfile1.txtgrepしたいと思います。sample1

grep -w '^sample1' file1.txt > sample1_file.txt
grep -w '^sample2' file2.txt > sample2_file.txt
grep -w '^sample3' file3.txt > sample3_file.txt
....
grep -w '^sample22' file22.txt > sample22_file.txt

次に、次を接続します。

cat  sample1_file.txt  sample2_file.txt  sample3_file.txt ...  sample22_file.txt > final_output.txt

答え1

努力する:

for i in {1..22}
do
    grep -w "^sample$i" "file$i.txt"
done >final_output.txt

メモ:

  1. {1..22}1から22までのすべての整数を実行します。 Cに慣れていない人にとっては、おそらくCよりも直感的ですが、柔軟性は低下します。((i=1;i<23;i+=1))

  2. ^sample$iシェルが拡張されるように、式を一重引用符ではなく二重引用符の中に入れることが重要です$i

  3. 必要なものであれば、final_output.txt中間ファイルを作成する必要はありません。

  4. final_output.txtステートメントの後にリダイレクトを配置するのが効率的であることに注意してください done。このようにして、シェルはこのファイルを一度だけ開いて閉じることができます。

答え2

あなたドル記号付きの参照パラメータと変数したがって、ループカウンタはループ内(一重引用符ではなく二重引用符内)でi使用できます。$idodoneループ部分を開始して終了するキーワード

したがって、単純な変換は次のようになります。

> final_output.txt
for (( i = 1 ; i < 23 ; i += 1)); do
    grep -w "^sample$i" "file$i.txt" > "sample${i}_file.txt"
    cat "sample${i}_file.txt" >> final_output.txt
done

数字のみを含む限り、引用符を使用する"file${i}.txt"必要はありませんが、iさまざまな理由で変数参照を引用することをお勧めします。

下線は変数名で有効で、書き込みは変数を参照するため、中sample${i}_file.txt括弧が必要であることに注意してください。${i}$i_file.txti_file

ループ内でファイルを追加するので、最初はファイルを消去します。もちろん、必要でない場合は、ファイル> final_output.txtの生成をスキップします。sample1_file.txtgrep ... >> final_output.txt

または、次のものを使用できます。支柱の拡張for (( ... ))ループを使用して手動で計算するのではなく、数値リストを作成します for i in {1..22}; do ... done

または標準のPOSIXシェルから:

i=1
while [ "$i" -lt 23 ] ; do
    grep ...
    i=$((i + 1))
done

答え3

使用:

#/bin/bash
:>final_output.txt
for i in {1..22}; do
    a=file"$i".txt
    b=sample"$i"_file.txt

    grep -w '^sample'"$i" "$a" > "$b"
    cat "$b" >> final_output.txt
done

この行は:>final_outputファイルをゼロバイトで消去します。
「Brace 拡張」は、{1..22}数字 1 2 3...22 のリストに展開されます。
この行は、for i in {1..22}; doすべての数字1 ... 22を繰り返します。すべての数字を保存するには
「追加」()が必要です。>>ファイルに出力します。

関連情報