2012-11-22 56 views
0

我有一个grep命令,让下面的字符串:grep和cut命令和鸿沟串

20121121001100 18 0 16 2 18 

,但我想修改这个字符串来获得

20121121 001 18 0 16 2 18 

正在上述值提取如下:

for i in `ls -1 file.txt | sort`; do echo $i` 
grep datetime $i | wc -l `` 
grep abc $i | wc -l `` 
grep def $i | wc -l `` 
grep ghi $i | wc -l `` 
grep jkl $i | wc -l ` ; done | cut -c9-500 

cut -c9-500被使用,因为原始字符串的形式是

datetime20121121001100 18 0 16 2 18 

切-c9-500回报

20121121001100 18 0 16 2 18 

是否有人可以帮助我获得

20121121 001 18 0 16 2 18 

(即删除的日期部分的最后3位)

回答

1

大部分你想要做的事都可以用awk完成。但对于你想要的最低限度:

for i in `ls -1 file.txt | sort`; do echo $i` 
grep datetime $i | wc -l `` 
grep abc $i | wc -l `` 
grep def $i | wc -l `` 
grep ghi $i | wc -l `` 
grep jkl $i | wc -l ` ; done | cut -c9-500 | awk '{print substr($0,1,11) substr($0,15) }' 

awk是非常有能力的文字处理。

编辑:我不知道的你在做什么,但是,basicly这样做(几乎)相同:

awk 'FILENAME != oldfilename {oldfilename = FILENAME; dt = 0 ; a = 0; d = 0; g = 0; j = 0} 
    /datetime/ {dt++} 
    /abc/ {a++} 
    /def/ {d++} 
    /ghi/ {g++} 
    /j/ {j++} 
    END {print FILENAME, dt, a, d, g, j}' * 

而且它的速度更快,更少的过程,等...基本上AWK处理文件,计算指定字符串的出现次数,以及何时完成文件(在最后一行之后)打印报告。

更改规格:

for i in `ls -1 file.txt | sort`; do echo $i` 
grep datetime $i | wc -l `` 
grep abc $i | wc -l `` 
grep def $i | wc -l `` 
grep ghi $i | wc -l `` 
grep jkl $i | wc -l ` ; done | cut -c9-500 | awk '{print substr($0,1,8) " " substr($0,9,4) substr($0,15) }' 
+0

感谢....重后 “的最后一行将打印报告” 将使用大量的内存? – mouthpiec

+0

不可以,因为您可以看到它会计入5个变量(每个文件都会重置),所以很可能现代机器(在1960年之后)可以处理它。 –

+0

谢谢....你第一个建议工作正常!你能否安排你的命令来取得“20121121 0010”而不是“20121121001”? – mouthpiec

0

管到的sed:

echo "20121121001100 18 0 16 2 18" | sed -r 's/^([0-9]+)[0-9][0-9][0-9] (.*)$/\1 \2/' 

20121121001 18 0 16 2 18 
+0

你可以添加上面的我的grep命令,因为我无法理解如何实现它。 – mouthpiec

+0

@mouthpiec:只需将您的cut命令的输出传递给上面的sed命令。 –