Unix:将额外的值列打印到文件

Unix:将额外的值列打印到文件

我有一个 .txt 文件 ( new_file.txt),其中有一列值 (200)。我需要在它旁边打印另一列,其值为 0,1/200,2/200.....1。我该怎么做?我对此很陌生,所以任何建议都会很棒!

我知道这seq 0 0.005 1 >new_file.txt会将其打印到文件中,但它会覆盖已经存在的值。我想将这些数字添加为文件中已存在的值旁边的另一列。

输入如下:

2.41
2.56 

等列中。我需要它看起来像

2.41 0
2.56 0.005

等列中。我需要在两者之间有一个选项卡。

答案1

seqpaste

seq 0 0.005 1 | paste newfile.txt - > newerfile.txt

awk

awk '{$2 = 0.005*(NR-1)} 1' OFS='\t' newfile.txt > newerfile.txt

根据您的版本awk,您也许可以newfile.txt就地修改。

答案2

正如评论中提到的,paste这是做你想做的事情的最佳选择。

 paste new_file.txt <sequence file>

如果你想在运行时生成序列

seq 0 0.005 1 | paste new_file.txt /dev/stdin

示例(对于 中的 5 条记录new_file.txt

~$ seq 0 0.005 0.020 | paste new_file.txt /dev/stdin
2.41    0.000
2.56    0.005
2.71    0.010
2.86    0.015
3.01    0.020

注意:如果任何文件/命令中有额外的行,则输出中的相应行将为空白。因此,请确保两个文件具有相同的行数。

答案3

GNU dc您可以使用以下方法进行操作:

< new_file.txt tr -- - _ | dc -e "[q]sq [?z1=qrd1<qrn32anp0.005+dd=?]s? 0l?x"

解释:

dc -e '
# macro for quitting
[q]sq

# macro to read next line and perform operations
[
   ? z1=q  # read next line and quit when it is empty. The 1 is apriori
   r       # else, reverse the stack elements so that sum is top of stack now
   d1<q    # quit if current sum is more than 1
   r       # else, reverse the stack elements so that line is top of stack now
   n 32an p # print the line, space (32a is ascii decimal for space), & print current sum
   0.005+   # update the current sum for next round
   dd=?     # recursively invoke itself for more.... its a loop essentially
]s?

# initialize stack and start operations
0 l?x
'

相关内容