Linux 使用awk创建具有特定列平方根的新文件

Linux 使用awk创建具有特定列平方根的新文件,linux,bash,for-loop,awk,Linux,Bash,For Loop,Awk,我必须找到文件test.text中某些特定列的值的平方根,然后将结果列写入另一个文件。文件test.txt如下所示 0004 0015 0018 0007 0015 0009 0003 0018 0012 0007 0013 0010 0018 0015 0002 0020 0007 0005 0010 0018 0015 0018 0007 0011 0010 0004 0013 0017 0016 0010 0019 0003 0002 0016 0005 0009 0002 0011 00

我必须找到文件test.text中某些特定列的值的平方根,然后将结果列写入另一个文件。文件test.txt如下所示

0004 0015 0018 0007 0015 0009 0003 0018 0012 0007 0013 0010 0018 0015 0002 0020 0007 0005
0010 0018 0015 0018 0007 0011 0010 0004 0013 0017 0016 0010 0019 0003 0002 0016 0005 0009
0002 0011 0015 0014 0008 0017 0002 0001 0015 0004 0008 0008 0002 0011 0015 0015 0009 0011
0013 0020 0005 0007 0007 0004 0019 0011 0001 0008 0013 0015 0015 0012 0007 0019 0009 0016
0003 0003 0020 0015 0007 0017 0005 0010 0012 0012 0009 0004 0016 0006 0014 0019 0001 0001
0014 0006 0016 0003 0008 0017 0002 0001 0011 0015 0014 0008 0016 0006 0014 0019 0012 0007
我必须找到第2,5,8,11的平方根。。etc列并将它们写入另一个文件。 经过搜索,我得到了下面的代码,只打印一列的平方根

awk '{r=$2; print "root=" sqrt(r)}' test.txt 
此代码仅打印第2列值的平方根

所以我使用for循环尝试了下面的代码

awk 'BEGIN{FS=" "}{for(r=2;r<=NF;r+=3) printf sqrt($r)}' test.txt >newtest.txt

awk'{for(r=2;rDo结果必须按任何特定顺序?如果不是,那么您可以做一些简单的事情,比如将现有的awk命令包装在bash“for”循环中。它应该按test.txt的顺序。就像test.txt中第二列的平方根应该是newtest.txt中的第一列,第五列的平方根应该是newtest.txt中的第二列。不是另一个for循环??Include sample output是可能的。它应该是
r+=3
。感谢@PesaThe的编辑。为Ank you@cyrus添加了很多示例输出。这正是我需要的。我不知道我们必须为分隔符添加额外的打印。还有一个疑问:是否有可能在test.txt中用新列替换旧列elf?
awk'{for(r=2;rTo避免每个输出行上的尾随空格,而不是
printf(%.11f),sqrt($r));print”“
您可以编写
printf“%.11f%s”,sqrt($r)(r@EdMorton:谢谢。在这个特殊情况下,
r+=3
I替换了
r
3.87298334621 3.87298334621 4.24264068712 3.60555127546 3.87298334621 2.64575131106 
4.24264068712 2.64575131106 2.00000000000 4.00000000000 1.73205080757 2.23606797750
3.31662479036 2.82842712475 1.00000000000 2.82842712475 3.31662479036 3.00000000000
4.47213595500 2.64575131106 3.31662479036 3.60555127546 3.46410161514 3.00000000000
1.73205080757 2.64575131106 3.16227766017 3.00000000000 2.44948974278 1.00000000000
2.44948974278 2.82842712475 1.00000000000 3.74165738677 2.44948974278 3.46410161514
awk '{for(r=2;r<=NF;r+=3) printf("%.11f ",sqrt($r)); print ""}' test.txt >newtest.txt
3.87298334621 3.87298334621 4.24264068712 3.60555127546 3.87298334621 2.64575131106 4.24264068712 2.64575131106 2.00000000000 4.00000000000 1.73205080757 2.23606797750 3.31662479036 2.82842712475 1.00000000000 2.82842712475 3.31662479036 3.00000000000 4.47213595500 2.64575131106 3.31662479036 3.60555127546 3.46410161514 3.00000000000 1.73205080757 2.64575131106 3.16227766017 3.00000000000 2.44948974278 1.00000000000 2.44948974278 2.82842712475 1.00000000000 3.74165738677 2.44948974278 3.46410161514