Awk 计算相邻列之间的所有差异

Awk 计算相邻列之间的所有差异,awk,sed,Awk,Sed,我在一个文件中有这样的数据,如下所示 60.5(r) 426.5(f) 810.5(r) 1176.5(f) 1560.5(r) 1926.5(f) 2310.5(r) 2676.5(f) 3060.5(r) 3426.5(f) 3810.5(r) 4176.5(f) 4560.5(r) 4926.5(f) 5310.5(r) 5676.5(f) 6060.5(r) 6426.5(f) 6810.5(r) 7176.5(f) 7560.5(r) 7926.5(f) 8310.5(r) 所有内容

我在一个文件中有这样的数据,如下所示

60.5(r) 426.5(f) 810.5(r) 1176.5(f) 1560.5(r) 1926.5(f) 2310.5(r) 2676.5(f) 3060.5(r) 3426.5(f) 3810.5(r) 4176.5(f) 4560.5(r) 4926.5(f) 5310.5(r) 5676.5(f) 6060.5(r) 6426.5(f) 6810.5(r) 7176.5(f) 7560.5(r) 7926.5(f) 8310.5(r)
所有内容都在同一行中,我想计算所有列的[2列-第1列][3列-第2列]之差,并复制到另一个文件中(在不同的行中)

我的尝试:

awk '{for (i=3;i < NF;i++) print $i}' > file.txt
awk'{for(i=3;ifile.txt

但我不知道如何删除
(r)
(f)
,同时进行差异处理,并复制到其他文件中

如果您只需要第2列和第1列以及第3列和第2列之间的差异:

awk '{gsub("\\([^)]*\\)",""); print $2 - $1, $3 - $2 }' input-file > output-file
如果需要所有列之间的差异:

 awk '{gsub("\\([^)]*\\)",""); for(i=2; i<= NF; i++) print $i - $(i-1)}' input > output
(i=2;i<代码>代码>回音’60.5(r)426.5(r)426.5(f)426.5(f)426.5(f)810.5(r)810.5(r)810.5(r)810.5(r)1176.5(r)1176.5(r)1176.5(r)1176.5(r)1176.5(r)426.5(r)426.5(r)426.5(f)426.5(f)426.5(f)426.5(f)426.5(f)426.5(f)426.5(f)426.5(f)426.5(f)416.5(f)786(f)786.5(f)810)786.5(f)786.5(f)786.5(f)810)810)810)810f)8310.5(r)'\ |awk-F'[()fr]+'' {对于(i=2;i 根据回答修改了

$echo'60.5(r)426.5(f)810.5(r)1176.5(f)1560.5(r)1926.5(f)2310.5(r)2676.5(f)3060.5(r)3426.5(f)3810.5(r)4176.5(f)4560.5(r)4926.5(f)5310.5(r)5676.5(f)6060.5(r)6426.5(f)6810.5(r)7176.5(f)7560.5(r)795(r)795(r)'\
|awk-vrs='[()fr]+'-vrs=''
1
根据答案进行修订

awk'BEGIN{RS=FS;ORS=”“}
1
打印连续列之间的差异,并每行输出一个:

$ awk 'NR>1&&NF{print $1-x}{x=$1}' RS='[(][rf][)]' file 
只需重定向输出以保存到新文件:

$ awk 'NR>1&&NF{print $1-x}{x=$1}' RS='[(][rf][)]' file > new_file 
如果要将差异全部显示在一行中:

$ awk 'NR>1&&NF{print $1-x}{x=$1}' RS='[(][rf][)]' file | xargs > new_file 

实际上,您不需要明确地删除
(r)
(f)
。当您对带有字符的字段执行数学运算时,它们会自动消失。这称为强制。因为在您的情况下,非数字字符位于数字之后,您可以简单地执行以下操作:

$ awk '{for(i=2;i<=NF;i++) printf "%d%s",$i-$(i-1),(i==NF?RS:FS)}' data
366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384

$awk'{for(i=2;我支持该解决方案,但在同一行中有大约30到40列。我想要两个连续列之间的差异,而不是JU 2,1和3,2。有几个问题尚不清楚,现在最相关的是您是否希望输出在一行中。如果您希望输出的行数与输入,使用
printf
+1我知道
+0
将字符串强制为数字,但我不知道awk对它如此苛刻!我今天学到了一些新东西。
$ awk 'NR>1&&NF{print $1-x}{x=$1}' RS='[(][rf][)]' file 
$ awk 'NR>1&&NF{print $1-x}{x=$1}' RS='[(][rf][)]' file > new_file 
$ awk 'NR>1&&NF{print $1-x}{x=$1}' RS='[(][rf][)]' file | xargs > new_file 
$ awk '{for(i=2;i<=NF;i++) printf "%d%s",$i-$(i-1),(i==NF?RS:FS)}' data
366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384 366 384