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