我有一个文本文件,格式如下:
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做到这一点?
答案 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
...