我有千行input.txt,每行在“grep”之后包含1个数字。
我希望从每5行划分第2到第4行数,每5行除以第1行,直到文件末尾。
我使用的方式是
paste - - - - - - <input.txt >lines.txt
将5行转换为一行,然后
awk '{print $2/$1,$3/$1,$4/$1,$5/$1}' lines.txt
这有点复杂。有没有更好的方法呢?
感谢。
更新 例如INPUT(一行一个号码) 1 2 4 五 6 7 8 9 10 .....
所需的输出 2 3 4 五 1.1667 1.3333 1.5 1.6667 .....
在grep之前,实际上有更多无用的列/行,我只是扔掉它们。 我是Unix命令的新手。我从这个网站上学到了很多东西。感谢所有想与我们分享经验的人。真的很感激!
答案 0 :(得分:1)
你可以使用awk完成整个事情:
awk '{if(NR%5==1)a=$1;else $1/=a}1' input.txt
if
分支取自第1,6,11行等。它将第一个字段的值保存在变量a
中。
else
分支在所有其他行上进行,并将字段的值除以a
。
最后的1
是{print}
的常用简写,表示输入文件中的每一行都会打印出来。
测试出来:
$ seq 10 | awk '{if(NR%5==1)a=$1;else $1/=a}1'
1
2
3
4
5
6
1.16667
1.33333
1.5
1.66667
答案 1 :(得分:1)
我使用
awk '{ n = $1; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1' filename
那是:
{
n = $1 # remember divisor
for(i = 1; i <= 4; ++i) { # four times:
v = 0 # Reset base value (to achieve the same output
# as the original approach in case the number
# of input lines is not cleanly divisible by 5)
getline v # fetch a new line into variable v (if there
# are no more lines, v is unchanged)
$i = v / n # set the ith field in the output to that line
# divided by the divisor
}
}
1 # then print
示例输出:
$ seq 1 12 | awk '{ n = $1; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1'
2 3 4 5
1.16667 1.33333 1.5 1.66667
1.09091 0 0 0
答案 2 :(得分:0)
这就是你想要的。使用seq
作为输入
$ seq 10 | awk '
NR % 5 == 1 {n=$1; next}
{printf "%f ", $1/n}
NR % 5 == 0 {print ""}
END {print ""}
'
2.000000 3.000000 4.000000 5.000000
1.166667 1.333333 1.500000 1.666667