Replace Awk替换文本文件的头

Replace Awk替换文本文件的头,replace,awk,Replace,Awk,我需要修复文本文件的标题 格式: 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 例如,您可以使用: $ awk 'NR==2 &&

我需要修复文本文件的标题

格式:

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

例如,您可以使用:

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

awk '...' file file > new_file && mv new_file file
试试这个:

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

嗯,不管出于什么原因,该命令似乎正在执行,但它不会为我打印任何内容。@csnate奇怪。。。什么都没有?例如,如果您使用
{first=$1;print first}
而不是仅使用
{first=$1}
,该怎么办。它能打印任何东西吗?它能完美地找到第一个和最后一个索引。它只是没有打印更新的文件。@csnate它看起来好像
f{print}
没有运行。也许您可以将其替换为
{if(f==1)print}
。遗憾的是没有更改。