【问题标题】:Cutting characters from certain lines if condition is met, otherwise printing whole line如果满足条件,则从某些行中剪切字符,否则打印整行
【发布时间】:2011-08-08 19:19:57
【问题描述】:

我想剪切一行的 n-N 个字符,但前提是该行以某些字符开头,否则我想打印整行。

简化文件示例:

John
123456987123
Mark
123546792019

我想创建两个新文件,一个包含前 6 个数字,另一个包含最后 6 个数字,但仍然包含标题,所以

John
123456
Mark
123546

John
987123
Mark
792019

我可以告诉 grep cut 仅在字符串匹配时才剪切,否则给出整个文件?如果满足条件或打印整行,哪种 awk 命令可以剪切行?

谢谢

【问题讨论】:

    标签: awk grep


    【解决方案1】:

    grep 只能grep,不能cut。

    awk '/^[0-9]/{print(substr($0,0,6));next;}
            # Fall through here in case of no match
            {print}' inputfile
    

    【讨论】:

    • 非常感谢!这完美地工作(有一堆修改)。我试图使用 grep 'CHAR' | cut -c n=N 但这样效果更好。
    【解决方案2】:

    您可以在一个 sed 脚本中生成 2 个文件,只读取一次输入文件。将下面的内容放入文本文件中,然后使用sed -f script_file input_file 运行。它将生成 f1 和 f2 文件并输出输入文件。

    /^[^0-9]/{
    w f1
    w f2
    }
    /^[0-9]/{
    h
    s/^\(.\{6\}\).*/\1/
    w f1
    g
    s/^.\{6\}//
    w f2
    g}
    

    【讨论】:

      【解决方案3】:

      grep 应该没问题:

      grep -E -o '^[0-9]{6}|^[^0-9].*' input > first.txt
      grep -E -o '[0-9]{6}$|^[^0-9].*' input > last.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多