我需要使用 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 列值之外,我还需要编写以下值
C
到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
我认为这可能有点过分了