を介してファイル名をサブセット化し、grep
結果ファイルをcat
。for ((i=1;i<23;i+=1));
私のファイルが与えられたら、次のようにfile1.txt
grepしたいと思います。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..22}
1から22までのすべての整数を実行します。 Cに慣れていない人にとっては、おそらくCよりも直感的ですが、柔軟性は低下します。((i=1;i<23;i+=1))
^sample$i
シェルが拡張されるように、式を一重引用符ではなく二重引用符の中に入れることが重要です$i
。必要なものであれば、
final_output.txt
中間ファイルを作成する必要はありません。final_output.txt
ステートメントの後にリダイレクトを配置するのが効率的であることに注意してくださいdone
。このようにして、シェルはこのファイルを一度だけ開いて閉じることができます。
答え2
あなたドル記号付きの参照パラメータと変数したがって、ループカウンタはループ内(一重引用符ではなく二重引用符内)でi
使用できます。$i
do
done
ループ部分を開始して終了するキーワード。
したがって、単純な変換は次のようになります。
> 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.txt
i_file
ループ内でファイルを追加するので、最初はファイルを消去します。もちろん、必要でない場合は、ファイル> final_output.txt
の生成をスキップします。sample1_file.txt
grep ... >> 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を繰り返します。すべての数字を保存するには
「追加」()が必要です。>>
ファイルに出力します。