我有以下格式的文件:
$ cat /tmp/raw
2015-01 5000 1000
2015-02 6000 2000
2015-03 7000 3000
现在,我想要从每行的第2列和第3列中获取组合值,以便结果如下:
2015-01 6000
2015-02 8000
2015-03 9000
我试过了,但它只显示文件中的最后一个值,如2015-03值。
我有以下格式的文件:
$ cat /tmp/raw
2015-01 5000 1000
2015-02 6000 2000
2015-03 7000 3000
现在,我想要从每行的第2列和第3列中获取组合值,以便结果如下:
2015-01 6000
2015-02 8000
2015-03 9000
我试过了,但它只显示文件中的最后一个值,如2015-03值。
Answers:
您可以尝试使用awk
:
awk '{ print $1, $2 + $3; }' /tmp/raw
结果将是(我认为2015-03的值应为10000):
2015-01 6000
2015-02 8000
2015-03 10000
以下是几种方法:
另一种awk方法
awk '{$2+=$3;}NF--' file
佩尔
perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
要么
perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
Shell(比上述速度慢/效率低)
while read a b c; do echo "$a $((b + c))"; done < file
$2+=$3
可能更笨拙。
awk '{$2+=$3}NF--'
因此仍然没有空白字段3徘徊。虽然那只是我的偏爱,但其过于相似,以至于无法单独发表答案:)
sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
...印刷品...
2015-01 6000
2015-02 8000
2015-03 10000
所以上述我声明一个正则表达式,其限定一个场范围,它由一个的*
可变长度,其是字符的单个序列^
不<空间>由紧接其后*
的可变长度,其是字符的单个序列<空格>。此声明是针对sed
的模式空间应用的,该模式空间是一个字符串(默认情况下)由\n
输入中出现的每个斜线字符定界,并且每次出现时都会用下一个递归替换(默认情况下)。
该声明的接口是双重的,并且在每个级别上,至少 由一个国际IEEE官方标准委员会全面监管和指定,以确保可预测地应用sed
命令语法。例如,在这种情况下,使用address 命令(始终是任何ubstitution命令的第一个组件)应用sed
的API语法,但更基本的API会将其内容解释为为该命令指定的子集功能在标准C库。/
/
sed s///
regcomp()
我可以自信地做出这些声明,因为sed
是不是只是一个程序,而相反,编译后的可执行文件命名sed
我的类Unix机器是执行的明确定义,在历史上建立的,与标准控制的sed
应用我的系统的regular-的表达式匹配库。
从sed
规格:
该
sed
实用程序应支持XBD基本正则表达式中描述的BRE 。
...我们找到的地方...
无论BREs里面和ERES通过在POSIX.1-2008下的系统接口的体积正则表达式匹配的接口支持
regcomp()
,regexec()
以及相关的功能。
调用的应用程序regcomp()
将显示一个模式字符串,并...
... [
regcomp()
该函数应编译pattern参数所指向的字符串中包含的正则表达式,并将结果放入结构preg ...
为此,该应用程序将引用regcomp()
的伴随函数...
... [t]
regexec()
该函数将string指定的以空值终止的字符串与通过先前调用... 初始化的已编译正则表达式preg进行比较regcomp()
...
regexec()
应当[一个]阵列的子串的偏移的元素填充字符串对应于\(
括号内的子表达式\)
的图案 ... 图案本身算作一个子表达式...... [T]他
regexec()
函数必须在所有填写nmatch的元素pmatch,其中nmatch和pmatch由应用程序提供的,即使某些元素pmatch不对应的子表达式的模式。
所以当我做...
/[^ ]* */
... sed
首先编译正则表达式并将结果存储在内存中,然后再将存储在那里的已编译自动机应用到我的模式空间的内容,以执行命令所需的次数。每次执行时,结果都是一个或多个以null分隔的字段的数组,这些字段以所返回的偏移量定界regexec()
。
当我做...
//
...以指示应该使用最近定义的正则表达式,sed
可以regexec()
再次调用以重新使用预编译的正则表达式,但是这次可以将其应用于更改后的字符串参数,或者按照我的命令应用新的nmatch参数。
更具体地说...
s/[^ ]* */[&]P/
[
&
]
P
s//&+pc/3
3
的第三次出现模式在图案空间&
本身,随后所附的字符串+pc
。因此,对于sed
给定的示例数据,对于的输入的每一行,它都会写入其stdout:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
这可能看起来很奇怪,但dc
计算器报价串在方括号内输入和P
命令都将打印堆栈的顶部而不附加一个\n
ewline和随后弹出的输入堆栈了这一关。
因此,以第一行为例dc
:
[2015-01 ]P
P
Rint并弹出堆栈顶部5000
5000
推到堆栈顶部,然后将堆栈上当前的所有元素(现在没有)向下推一。1000
+
6000
。[
字符串,则这是语法错误]
。p
p
使堆栈顶部紧随其后,然后附加附加的\n
ewline,而不会将其从堆栈中弹出。c
c
学习堆栈