这是我试图添加最后一个参数的脚本,将FNR打印到第四个字段中。AWK打印FNR从0开始递增
#!/usr/bin/awk -f
{ sub(/\r$/,"") }
/^BEGIN_DATA_FORMAT/{
getline
for (i=1;i<=NF;i++)
if ($i~/LAB/) a[i]=$i
}
/^BEGIN_DATA$/,/^END_DATA$/{
s="";
if (NF<2) next; else
for (j in a)
s=s?s"\t"$j:$j
print s
}
这是该脚本输出的样子:
48.34 -55.88 19.19
26.95 24.36 13.43
25.53 4.45 -20.68
71.27 6.68 24.28
...
这是我的第二个脚本:
#!/usr/bin/awk -f
{ OFS = "\t"; $4="(Untitled "FNR-1")"; print $0 }
管道中的第一个脚本进入第二脚本返回预期结果与FNR从第四个字段中的0开始。
48.34 -55.88 19.19 (Untitled 0)
26.95 24.36 13.43 (Untitled 1)
25.53 4.45 -20.68 (Untitled 2)
71.27 6.68 24.28 (Untitled 3)
...
我试过组合脚本,但我没有得到我想要的输出。
#!/usr/bin/awk -f
{ sub(/\r$/,"") }
/^BEGIN_DATA_FORMAT/{
getline
for (i=1;i<=NF;i++)
if ($i~/LAB/) a[i]=$i
}
/^BEGIN_DATA$/,/^END_DATA$/{
s="";
if (NF<2) next; else
for (j in a)
s=s?s"\t"$j:$j
print s
}
{
OFS = "\t"
$4="(Untitled "FNR-1")"
print $4
}
这是给出的输出。问题是它引用的是相同的文件,而不是最后一个命令的输出。
(Untitled 0)
(Untitled 1)
(Untitled 2)
(Untitled 3)
(Untitled 4)
(Untitled 5)
(Untitled 6)
(Untitled 7)
(Untitled 8)
(Untitled 9)
(Untitled 10)
(Untitled 11)
(Untitled 13)
(Untitled 14)
(Untitled 15)
48.34 -55.88 19.19
(Untitled 17)
26.95 24.36 13.43
(Untitled 18)
25.53 4.45 -20.68
(Untitled 19)
71.27 6.68 24.28
(Untitled 20)
...
我也试过这样:
#!/usr/bin/awk -f
{ sub(/\r$/,"") }
/^BEGIN_DATA_FORMAT/{
getline
for (i=1;i<=NF;i++)
if ($i~/LAB/) a[i]=$i
}
/^BEGIN_DATA$/,/^END_DATA$/{
s="";
if (NF<2) next; else
for (j in a)
s=s?s"\t"$j:$j
OFS = "\t"
$4="(Untitled "FNR-1")"
print s OFS $4
}
输出更接近,但问题是,它仍然是争论的FNR计数。我需要它为0
48.34 -55.88 19.19 (Untitled 17)
26.95 24.36 13.43 (Untitled 18)
25.53 4.45 -20.68 (Untitled 19)
71.27 6.68 24.28 (Untitled 20)
...
开始有人能告诉我正确的方法对这些脚本结合?
这是另一个管道。如果可以,最好减少工具的数量,不是吗?我通常会在awk中添加一个额外的条件,从而在一串管道中留下“grep”。这也不例外。 – ghoti 2012-02-01 02:54:03
@glenn jackman谢谢,我有史以来第一次听说AWK。我认为增加一个变量太清楚了,因为我被困在一个特定的路径上。我也没有使用dos2unix来运行这个脚本真的是唯一需要的步骤。 – jeffrbauer 2012-02-01 03:08:22