向文本添加常量值列

时间:2013-07-16 11:04:02

标签: bash awk

我有一个文本文件,格式如下:

0.000561859 100.001 0.724805
0.000994887 99.999 0.724788
0.0012519 100.002 0.724732
0.00138511 99.9941 0.724614
.
.
.

我想生成一个表格,表格的第一列有一个从第三列的第一个值得到的常数值,比如说

0.724805 0.000561859 100.001 0.724805
0.724805 0.000994887 99.999 0.724788
0.724805 0.0012519 100.002 0.724732
0.724805 0.00138511 99.9941 0.724614
.
.
.

我怎样才能在Linux中用bash做到这一点?

4 个答案:

答案 0 :(得分:5)

如果你想存储第一行第三个值的值,然后沿着所有行打印它,

awk可能是一个不错的选择。

$ awk 'NR==1 {v=$3}{print v,$0}' file
0.724805 0.000561859 100.001 0.724805
0.724805 0.000994887 99.999 0.724788
0.724805 0.0012519 100.002 0.724732
0.724805 0.00138511 99.9941 0.724614

解释

  • NR指的是行数。因此,对于NR==1 {v=$3},它在行号1中存储变量v中第3个值的值。因此,这个条件只执行一次,一个读取第一行。
  • 将值存储在v后,每次读取一行时,都会打印v加上整行($0)和{print v,$0}。所以这条件就在每一行都执行了。

答案 1 :(得分:3)

这样可以解决问题:

$ awk 'NR==1{a=$3}{print a,$0}' file 
0.724805 0.000561859 100.001 0.724805
0.724805 0.000994887 99.999 0.724788
0.724805 0.0012519 100.002 0.724732
0.724805 0.00138511 99.9941 0.724614

答案 2 :(得分:1)

awk -v r=1 -v c=3 '{a[NR]=$0}NR==r{p=$(c)}END{for(i=1;i<=NR;i++)print p,a[i]}' file

使用此行,您只需更改r(行)和c(列)即可获得相应的输出。例如,第20行中的第3列,您设置了r=20 and c=3。根据您的示例,输出为:

0.724805 0.000561859 100.001 0.724805
0.724805 0.000994887 99.999 0.724788
0.724805 0.0012519 100.002 0.724732
0.724805 0.00138511 99.9941 0.724614

答案 3 :(得分:1)

Perl解决方案:

perl -ne 'chomp; $p=(split)[2] unless defined $p; print "$p $_\n"' file

或(使用更多Perl魔法,正如 glenn jackman 所建议的那样):

perl -lne '$p //= (split)[2]; print "$p $_"' file

输出:

0.724805 0.000561859 100.001 0.724805
0.724805 0.000994887 99.999 0.724788
0.724805 0.0012519 100.002 0.724732
0.724805 0.00138511 99.9941 0.724614
...