当前位置: 技术问答>linux和unix
UNIX 去空格和截取问题
来源: 互联网 发布时间:2016-07-21
本文导语: UNIX中怎样去空格和截取啊? 我现在有如下数据:(我想把时间取出来) AT 0030 +1DAYS UNTIL 0130 +1DAYS 我打算先把文件去空格,搞成:AT0030+1DAYSUNTIL0130+1DAYS 再从AT截取0030,再从UNTIL 截取0130, 截取的方法是:。。...
UNIX中怎样去空格和截取啊?
我现在有如下数据:(我想把时间取出来)
AT 0030 +1DAYS UNTIL 0130 +1DAYS
我打算先把文件去空格,搞成:AT0030+1DAYSUNTIL0130+1DAYS
再从AT截取0030,再从UNTIL 截取0130,
截取的方法是:。。。
我现在有如下数据:(我想把时间取出来)
AT 0030 +1DAYS UNTIL 0130 +1DAYS
我打算先把文件去空格,搞成:AT0030+1DAYSUNTIL0130+1DAYS
再从AT截取0030,再从UNTIL 截取0130,
截取的方法是:。。。
|
首先,如果用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 ''
数据如下:
[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 ''