0

我有一个具有以下格式的文本文件:

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

4 回答 4

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中。所以这个条件只执行一次,读取第一行。
  • 一旦将值存储在 中v,并且每次读取一行时,它都会打印v加上整行 ( $0) 和{print v,$0}。所以这个条件在每一行都执行。
于 2013-07-16T11:06:41.047 回答
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
于 2013-07-16T11:09:45.370 回答
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

with this line, you just change the r (row) and c (column) to get the corresponding output. For example, the 3rd column in row 20, you set r=20 and c=3. With your example in question, the output is:

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
于 2013-07-16T11:08:12.383 回答
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
...
于 2013-07-16T11:22:27.413 回答