0

我有一个 grep 命令,它提供以下字符串:

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

并 cut -c9-500 返回

20121121001100 18 0 16 2 18

有人可以帮我得到吗

20121121 001 18 0 16 2 18

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

4

2 回答 2

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非常擅长文本处理。

编辑:我不确定你在做什么,但是,基本上这(几乎)是一样的:

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) }'
于 2012-11-22T14:36:44.763 回答
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
于 2012-11-22T14:38:27.480 回答