我的数据由具有两列的 file1 和具有一列的 file2 组成。我需要应用这个计算
for (i = 1; i == NR)
{x = ($1-T1)/Fi; print (x-int(x))}
其中 $1 是文件 1 的第一列,T1 是文件 1 的第一列的第一行,Fi 是文件 2 中的第 i 行。
文件1
5 2
56 3
566 2
54 2
文件2
1
2
6
8
计算应该是
{x = ($1(file1)-5)/1; print (x-int(x))}
--> output1
{x = ($1(file1)-5)/2; print (x-int(x))}
--> output2
{x = ($1(file1)-5)/6; print (x-int(x))}
--> output3
{x = ($1(file1)-5)/8; print (x-int(x))}
--> output4
期望的结果是四个文件,每列包含 4 个数字。我的意思是只有 $1 是在计算过程中变化的数字,其他变量是固定的。
答案1
awk 'FNR == NR { F[++n] = $1; next } FNR == 1 { T1 = $1 } { for (i = 1; i <= n; ++i) { x = ($1 - T1)/F[i]; print x - int(x) >"output" FNR} }' file2 file1
file2
首先读取(命令行上给出的第一个文件,其中包含单列的文件)的内容并将其存储在数组中F
。
然后,它读取file1
并为其每一行计算与数组中的值一样多的数字F
。对于这些计算出的数字的每一行,file1
都会输出到一个文件中,该output
文件的名称后跟file1
.
结果:
$ ls
file1 file2 output1 output2 output3 output4
$ cat output1
0
0
0
0
$ cat output2
0
0.5
0.5
0.375
$ cat output3
0
0.5
0.5
0.125
$ cat output4
0
0.5
0.166667
0.125
$ cat output5
带注释的脚本awk
:
FNR == NR {
# This is the first file.
# Read its data into F, and then continue.
F[++n] = $1
next
}
# We are now only processing the second file.
FNR == 1 {
# Save T1 from the first line of the second file.
T1 = $1
}
{
# Loop through F and compute x for each.
for (i = 1; i <= n; ++i) {
x = ($1 - T1)/F[i]
# Print to the file given by the current line number.
print x - int(x) >"output" FNR
}
}