我正在编写一个我正在编写的csh脚本的问题。
我想做的是读取一个文件,并且对于我正在阅读的这个文件的每一个新行,为我稍后将使用的某个变量分配一个新值。
为了简化我有一个字符串,名为“zn”的数组包含6个值。我可以使用smth打印每个值,如:
echo ${zn[$i]}
然后我尝试使用这个数组的值(简单的例子来解释):
cat file1 | awk '{i=NR;n='${zn[i]}';print n,$0}' >! file2
或其他尝试:
cat file1 | awk '{n='${zn[NR]}';print n,$0}' >! file2
好吧,我几乎尝试了括号,撇号,引号的所有可能组合......我总是会遇到一些错误,如:
missing -.
任何帮助都会非常感激,解决方案可能很简单明了。 (对不起,如果我的语法不是最好的,但我对此有点新鲜)
修改 我用bash移植了脚本
...这是我用来准备一些文本文件以在GMT中准备图形的脚本的一部分:
cat crosspdf.dat |
awk '
BEGIN { n = int(('$dz')/('$dz_new')) }
{
z=$1
for (i=6;i<=NF;i++) {
if ($i!=0) {
for(j=1;j<=n;j++)
print (i-4)*'$dv', z+(j-n/2)*'$dz_new', $i
}
}
}
' >! temp
这很有效:你唯一需要知道的是$ dz是一个常数值,现在我想改变它,以便为我正在扫描的文件的每一行设置不同的值。我可以轻松地使用值准备数组,但我无法通过在前一行中以某种方式包含它。 PS:感谢支持 - Francesco 2分钟前编辑
编辑2
1)dv和dz_new只是参数 2)dz是一个变量长度只包含数字的数组(深度间隔:smth像-6.0 1.0 5.0 10.0 ... 36.0) 3)crosspdf.dat包含一些类似直方图的数据:每条线对应不同的深度(深度等距,现在不再,所以这就是我需要使用dz数组的原因)
答案 0 :(得分:1)
让我们从重写脚本开始:
cat crosspdf.dat |
awk '
BEGIN { n = int(('$dz')/('$dz_new')) }
{
z=$1
for (i=6;i<=NF;i++) {
if ($i!=0) {
for(j=1;j<=n;j++)
print (i-4)*'$dv', z+(j-n/2)*'$dz_new', $i
}
}
}
'
以正确的方式将shell变量值传递给awk并清理UUOC。以上内容应写为:
awk -v dv="$dv" -v dz="$dz" -v dz_new="$dz_new" '
BEGIN { n = int(dz/dz_new) }
{
z=$1
for (i=6;i<=NF;i++) {
if ($i!=0) {
for(j=1;j<=n;j++)
print (i-4)*dv, z+(j-n/2)*dz_new, $i
}
}
}
' crosspdf.dat
现在您需要回答的一些问题是:您希望哪个shell变量(dv
,dz
和/或dz_new
)为每行提供不同的值输入文件?这些shell变量的代表值是什么? crosspdf.dat
可以包含哪些值?您的预期输出会是什么样的?
更新您的问题,以显示crosspdf.dat
的一些小样本,数组变量的一些设置以及所有这些的预期输出。
实际上 - 也许这就是你需要的所有提示:
$ cat file
abc
def
ghi
$ cat tst.sh
dz="12 23 17"
awk -v dz="$dz" '
BEGIN{ split(dz,dzA) }
{ print dzA[NR], $0 }
' file
$ ./tst.sh
12 abc
23 def
17 ghi
有问题吗?