awkを使用してループインデックスをファイルとして印刷する必要があります。これが私が使用するコードです。
echo "Write the start and end file number:"
read sta end
echo "$sta" "$end"
for (( c="$sta"; c<="$end"; c++ ))
do
echo "$c"
awk '{if (NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52) {print $1 " " $8 " " $9 " " $10}}' RD00$c/MergerHalos.out >> center_raw.dat
done
列値1、8、9、10に加えて、次の値を書き込む必要があります。
氏
center_raw.datに。
答え1
あなたの要件が何であるかはよくわかりませんが、以下で推論できるのはあなたの要件のようです。
awk -v var="$c" '{if (NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52) {print var ":" $1 " " $8 " " $9 " " $10}}' RD00$c/MergerHalos.out >> center_raw.dat
-v
オプションは、awk
awk で外部 bash 変数の値を渡すために使用されます。
答え2
スタイルに合わせてすばやく書き換え(乾燥機)
for (( c=sta; c<=end; c++ )); do
awk -v c=$c '
NR == 15 {exit}
function ok(val) {return (0.48 < val && val < 0.52)}
ok($8) && ok($9) && ok($10) {print c, $1, $8, $9, $10}
' RD00$c/MergerHalos.out
done >> center_raw.dat
答え3
私の考えでは、あなたはすべてをawkで行うことができると思います。
awk '
function readfile(i){
file="RD00"i"/MergerHalos.out"
while ( (getline < file) > 0) {
if(NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52)
print i":"$1,$8,$9,$10 > center_raw.dat
}
close(file)
}
BEGIN{
sta=ARGV[1]
end=ARGV[2]
ARGC=0
while(end>sta){print end;readfile(end--)}
}' $start $end
これは少し過ごすかもしれません。