日期:2014-05-16  浏览次数:21054 次

UNIX 去空格和截取问题
UNIX中怎样去空格和截取啊?
我现在有如下数据:(我想把时间取出来)

 AT 0030 +1DAYS UNTIL 0130 +1DAYS

我打算先把文件去空格,搞成:AT0030+1DAYSUNTIL0130+1DAYS

再从AT截取0030,再从UNTIL 截取0130,
截取的方法是:。。。

------解决方案--------------------
tr -d ' ' | sed -r 's/^AT([0-9]*).*UNTIL([0-9]*).*/\1 \2/'
------解决方案--------------------
首先,如果用gawk -f参数,那么f后面接的必须是awk的[program]文件,而不是单独的program。
数据如下:
[Hsxzhe--21:57:25 sed]$:cat time
AT 0030 +1DAYS UNTIL 0130 +1DAYS
AT 0031 +1DAYS UNTIL 0131 +1DAYS
AT 0032 +1DAYS UNTIL 0132 +1DAYS
AT 0033 UNTIL 0133 +1DAYS
AT 0034 +1DAYS UNTIL 0134 +1DAYS
AT 0035 UNTIL 0135 +1DAYS
AT 0036 +1DAYS UNTIL 0136 +1DAYS
AT 0037 +1DAYS UNTIL 0137 +1DAYS
[Hsxzhe--21:57:27 sed]$:cat time.awk
{
if($4=="UNTIL")
print $2, $5
else
print $2, $4
}
[Hsxzhe--21:57:52 sed]$:gawk -f time.awk time
0030 0130
0031 0131
0032 0132
0033 0133
0034 0134
0035 0135
0036 0136
0037 0137
[Hsxzhe--21:58:24 sed]$:


其次,如果你不想另外建[program]文件的话就不能在gawk后再加-f
数据如下:
[Hsxzhe--21:58:24 sed]$:gawk '{if($4=="UNTIL")print $2, $5;else print $2, $4}' time
0030 0130
0031 0131
0032 0132
0033 0133
0034 0134
0035 0135
0036 0136
0037 0137
[Hsxzhe--22:00:43 sed]$:



最后,对tr -d ' ' | sed -r 's/^AT([0-9]*).*UNTIL([0-9]*).*/\1 \2/' 的理解。
tr -d是过滤数据中的控制字符,这确实很有必要。
括号表达式,替换字符串中的\1代表搜索字符串中的第一个转义圆括号,\2代表第二个,括号表达式在搜索字符串中需要用反斜杠\转义,故其实是:sed 's/^AT \([0-9]*\).*UNTIL \([0-9]*\).*/\1 \2/'
带有转义圆括号的正则表达式于没有该圆括号的作用相同,于是上面这个其实是sed 's/^AT [0-9]*.*UNTIL [0-9]*.*/\1 \2/',这样容易理解了,搜索字符串中:^AT行首匹配,然后是时间,.*匹配两个时间中间的任意字串。替换字符串中:用搜索字符中的两个圆括号中匹配到字串代替全行。

数据如下:
[Hsxzhe--22:22:53 sed]$:cat time
AT 0030 +1DAYS UNTIL 0130 +1DAYS
AT 0031 +1DAYS UNTIL 0131 +1DAYS
AT 0032 +1DAYS UNTIL 0132 +1DAYS
AT 0033 UNTIL 0133 +1DAYS
AT 0034 +1DAYS UNTIL 0134 +1DAYS
AT 0035 UNTIL 0135 +1DAYS
AT 0036 +1DAYS UNTIL 0136 +1DAYS
AT 0037 +1DAYS UNTIL 0137 +1DAYS
[Hsxzhe--22:22:58 sed]$:tr -d ''<time|sed 's/^AT \([0-9]*\).*UNTIL \([0-9]*\).*/\1 \2/'
0030 0130
0031 0131
0032 0132
0033 0133
0034 0134
0035 0135
0036 0136
0037 0137
[Hsxzhe--22:23:02 sed]$: