【问题标题】:Grep and Cut Command and divide stringGrep 和 Cut 命令并分割字符串
【发布时间】:2012-11-22 14:31:27
【问题描述】:

我有一个 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位)

【问题讨论】:

    标签: grep cut divide


    【解决方案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) }'
    

    【讨论】:

    • thanks .... re"最后一行后会打印报告"会占用大量内存吗?
    • 不,正如您所看到的,它将计入 5 个变量(每个文件都会重置),因此很可能现代机器(在 1960 年 ummm 之后)可以处理它。
    • 谢谢....您的第一个建议效果很好!你能安排你的命令得到“20121121 0010”而不是“20121121001”吗?
    • 是的...但是现在规范有所改变:) ...是否有可能获得“20121121 0010”?
    • 是的。看到这个页面:mattgemmell.com/2008/12/08/what-have-you-tried(我正在编辑帖子......)?
    【解决方案2】:

    到 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
    

    【讨论】:

    • 你能把上面的内容添加到我的 grep 命令中吗,因为我不明白如何实现它。
    • @mouthpiec:只需将 cut 命令的输出通过管道传输到上面的 sed 命令即可。
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2012-12-28
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多