我有一个 .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
与seq
和paste
:
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
'