【问题标题】:Awk Replace Header of a Text Fileawk 替换文本文件的标题
【发布时间】:2014-04-15 20:23:55
【问题描述】:

我需要修复一个文本文件的标题。

格式:

Key firstRowColumn1 lastRowColumn1
1 Data
2 Data
3 Data
4 Data

基本上,标题必须有第一个和最后一个索引,它位于我实际数据的第一列中。我有一组看起来像这样的文件:

Key 0 0
1 Data
2 Data
3 Data
4 Data

如何使用 awk 将它们修复为如下所示?

Key 1 4
1 Data
2 Data
3 Data
4 Data

【问题讨论】:

    标签: replace awk


    【解决方案1】:

    你可以使用这个:

    $ awk 'NR==2 && FNR==2 {first=$1} NR>2 && FNR==1 {print "Key", first, prev; f=1; next} f{print} {prev=$1}' file file
    Key 1 4
    1 Data
    2 Data
    3 Data
    4 Data
    

    说明

    它在文件中循环两次。第一次获取数据,然后打印。

    • NR==2 && FNR==2 {first=$1} 在第一个循环中,获取第 2 行第一个字段的值。这是“第一个”值。
    • NR>2 && FNR==1 {print "Key", first, prev; f=1; next} 如果我们第二次读取文件,请打印带有收集到的信息的标题。将标志 f 设置为 true,以便从现在开始打印行。跳过记录以便不打印当前行。
    • f{print} 如果设置了标志 f,则打印该行。这将在第二次读取文件期间完成。
    • {prev=$1} 存储第一个字段的值,用于下一行获取“结束”值。

    如果您想更新当前文件,请执行以下操作:

    awk '...' file file > new_file && mv new_file file
    

    【讨论】:

    • 嗯,无论出于何种原因,该命令似乎已执行,但它并没有为我打印任何内容。
    • @csnate 奇怪...什么都没有?例如,如果您使用{first=$1; print first} 而不仅仅是{first=$1} 会怎样。它打印什么吗?
    • 完美找到第一个和最后一个索引。它只是不打印更新的文件。
    • @csnate 看起来 f{print} 不正常。也许您可以将其替换为{if (f==1) print}
    • 遗憾的是没有变化。
    【解决方案2】:

    试试这个:

    echo "Key $(sed -n '2s/^\([^ ]\+\) .*/\1/p' yourfile) $(tac yourfile | sed -n '1s/^\([^ ]\+\) .*/\1/p')" && sed -n '2,$p' yourfile
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2017-09-19
      相关资源
      最近更新 更多