用awk或sed减去第一列中的数字

时间:2013-01-26 08:03:43

标签: sed awk

我有一个文本文件,如下所示。我想减去第一列中的数字,并将一个带有计算值(绝对值)的新列添加到输入文件中,而不是打印输出。如何使用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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用awk:

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

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

Online demo

答案 2 :(得分: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