如何使用 awk 在 txt 文件的开头插入一列?

How to insert a column at the start of a txt file using awk?

如何在 txt 文件的开头插入一列 运行 从 1 到 2059,这对应于我使用 awk 在我的文件中的行数。我知道命令将是这样的:

awk '{$1=" "}1' 文件

不确定在 speech-marks 1-2059 之间放什么?

我还想在 header 行中包含一个 header,因此从技术上讲,1 应该只放在第二行。

**ID**     Heading1
RQ1293939    -7.0494
RG293I32SJ   -903.6868
RQ19238983   -0899977
rq747585950   988349303
FID  **ID**     Heading1
1    RQ1293939    -7.0494
2    RG293I32SJ   -903.6868
3    RQ19238983   -0899977
4    rq747585950   988349303

所以我需要在第一列下方插入 1 - 2059 运行 的 FID

您显示的内容不起作用,它只是将第一个字段 (</code>) 替换为 space 并打印结果。如果您没有空行,请尝试:</p> <pre><code>awk 'NR==1 {print "FID\t" [=10=]; next} {print NR-1 "\t" [=10=]}' File

解释:

  • NRawk 变量,它计算记录(在我们的例子中是行),从 1 开始。所以 NR==1 是一个条件,仅当 awk 处理第一行。在这种情况下,操作块表示打印 FID、制表符 (\t)、原始行 ([=19=]),然后移至下一行。
  • 第二个动作块只有在第一个动作块还没有被执行时才会执行(由于最后的 next 语句)。它打印 NR-1,即行号减一、制表符和原始行。

如果您有空行并且想跳过它们,我们将需要一个计数器变量来跟踪当前的非空行号:

awk 'NR==1 {print "FID\t" [=11=]; next} NF==0 {print; next} {print ++cnt "\t" [=11=]}' File

解释:

  • NFawk 变量,它计算记录中的字段(在我们的例子中是 space 分隔的词)。所以 NF==0 是一个仅在空行(或仅包含 space 的行)上成立的条件。在这种情况下,操作块表示打印空行并移至下一行。
  • 最后一个操作块仅在其他两个操作块中的 none 已执行时执行(由于它们的最终 next 语句)。它递增 cnt 变量,打印它,打印制表符,然后打印原始行。
  • 未初始化的 awk 变量(如我们示例中的 cnt)在首次用作数字时取值为 0。 ++cntprint 命令使用其值之前递增变量 cnt。所以第一次执行这个块时 cnt 在打印之前取值 1。请注意,cnt++ 会在打印后递增。

假设您的 header 行和其余数据之间确实没有空白行:

awk '{print (NR>1 ? NR-1 : "FID"), [=10=]}' file

如果您希望输出为 tab-separated,请使用 awk -v OFS='\t' '...' file;如果您希望输出以表格形式显示,请将其通过管道传输至 column -t