【问题标题】:Adding a specific pattern,if needed, in every line of a text file linux如果需要,在文本文件 linux 的每一行中添加特定模式
【发布时间】:2014-12-28 20:01:37
【问题描述】:

我有以下格式的文件(空格是一个制表符)

sentenceA1      sentencek1
        sentencek2
        sentencek3
sentenceA2      sentencel1
        sentencel2

我希望输出是:

sentenceA1      sentencek1
sentenceA1      sentencek2
sentenceA1      sentencek3
sentenceA2      sentencel1
sentenceA2      sentencel2

我尝试通过创建两个文件(使用 sed)来分隔值,一个带有第一个值,一个带有第二个值,但我不知道之后如何成功合并它们
仅使用 sed 或 awk 是否可以做到这一点?

【问题讨论】:

    标签: linux shell awk sed scripting


    【解决方案1】:

    这个 awk 应该可以工作:

    awk 'NF==2{p=$1; print; next} {print p, $1}' file
    A1 k1
    A1 k2
    A1 k3
    A2 l1
    A2 l2
    

    【讨论】:

    • 问题是A1、A2、k1等可能不止一个词,虽然两个值之间的分隔总是两个空格
    • 您应该通过编辑您的问题并提供更真实的示例数据来指定这一点。
    • 提供实时数据
    • @Nick:如果字段分隔符正好是 2 个空格,则使用:awk -F ' ' 'NF==2{p=$1; print; next} {print p, $0}' file
    • 我现在意识到它们是制表符分隔的。很抱歉给您带来不便,但您能解决标签分隔问题吗?
    【解决方案2】:
    awk '!/^\t/{p=substr($0,1,index($0,"\t"))} /^\t/{$0=p$0}1' input
    

    【讨论】:

    • 这可行,但会在索引中添加一个额外的 tab,将其删除为 -1。你也不需要做同样的测试两次:awk '{/^\t/?$0=p$0:p=substr($0,1,index($0,"\t")-1)}1'
    【解决方案3】:

    这只是一个基于 anubhavas 帖子重写的awk 以获得正确的数据。

    awk -F"\t" '$1{p=$1;print;next} {print p$0}' file
    sentenceA1      sentencek1
    sentenceA1      sentencek2
    sentenceA1      sentencek3
    sentenceA2      sentencel1
    sentenceA2      sentencel2
    

    由于所有行中都有tabs,因此所有行将具有相同数量的字段。
    如果行以tab 开头,则第一个字段将为空,因此$1 将对此进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2016-04-03
      • 2015-10-03
      相关资源
      最近更新 更多