【问题标题】:Insert a new line after matching some text in bash在 bash 中匹配某些文本后插入新行
【发布时间】:2019-08-24 17:41:38
【问题描述】:

我有一个文件:

aaaa_bbb_ccc: something
aaaa_ddd_zzz: something
bbbb_ccc_ddd: something
bbbb_ccc_eee: something
bbbb_ddd_eee: something
bbbb_ddd_fff: something
bbbb_eee_ggg: something

我想插入一个新行,基本上按第一个单词排序,然后按字母顺序按第二个分组,如下所示:

aaaa_bbb_ccc: something

aaaa_ddd_zzz: something

bbbb_ccc_ddd: something
bbbb_ccc_eee: something

bbbb_ddd_eee: something
bbbb_ddd_fff: something

bbbb_eee_ggg: something

我试过awk 'NR>1 && a && substr($1,1,1)!=a{ print "" }{ a=substr($1,1,1) }1',但它只在第一个单词之后插入。

【问题讨论】:

  • 你自己尝试了什么?

标签: shell sorting awk


【解决方案1】:

试试这个 awk 单行代码:

awk -F'_' '{k=$1FS$2}k!=p&&NR>1{print ""}7;{p=k}' file

这适用于给定的示例。您的输入文件必须已排序且不存在空行。

【讨论】:

    【解决方案2】:

    另一个 awk,假设您在问题中的输入已排序

    awk -F"_" ' { c=$2;if(c!=p && NR>1) { print "" } print ; p=c; } ' file
    

    【讨论】:

    • 如果像a_x 然后b_x 这样的连续行会失败?
    • 创建密钥时必须包含 $1 - c=$1 FS $2。当然,它与@Kent's answer 相同
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多