0

我有一个如下所示的文本文件。我想减去第一列中的数字,然后在输入文件中添加一个带有计算值(绝对值)的新列,而不是打印输出。如何使用 awk 或 sed 对多个文件执行此操作?

46-104   46   3.95073
46-46    46   1.45997
50-50    50   1.51589
52-100   52   4.16567

期望的输出

46-104   46   3.95073   58
46-46    46   1.45997   0
50-50    50   1.51589   0
52-100   52   4.16567   48
4

3 回答 3

2

这是使用的快速方法awk

awk '{ split($1,a,"-"); print $0, (a[1]-a[2] >= 0 ? a[1]-a[2] : a[2]-a[1]) | "column -t" }' file

结果:

46-104  46  3.95073  58
46-46   46  1.45997  0
50-50   50  1.51589  0
52-100  52  4.16567  48

对于多个文件,假设您当前的工作目录中只有感兴趣的文件:

for i in *; do awk '{ split($1,a,"-"); print $0, (a[1]-a[2] >= 0 ? a[1]-a[2] : a[2]-a[1]) | "column -t" }' "$i" > "$i.temp" && mv "$i.temp" "$i"; done
于 2013-01-26T08:17:49.173 回答
0

使用 awk:

function abs(value)
{
    return (value<0?-value:value);
}

{
    split($1, v, "-")        
    print $0, "\t", abs(v[1]-v[2])
}

在线演示

于 2013-01-26T08:21:14.063 回答
0

这可能对您有用(GNU sed 和 bc):

sed -r 'h;s/(\S+).*/echo \1|bc/e;H;x;s/\n-?/ /' file
  • h将该行复制到保留空间 (HS)
  • s/(\S+).*/echo \1|bc/e在模式空间中做数学
  • H将换行符和答案附加到 HS 中的原始行
  • x交换 PS 和 HS
  • s/\n-?/ /用空格替换换行符和任何负号

沿着同样的路线使用 awk:

 awk '{split($1,a,"-");b=a[1]-a[2];sub(/-/,"",b);print $0,b}' file
于 2013-01-26T08:37:48.140 回答