awk将列名更改为文件名

时间:2017-07-31 13:59:49

标签: awk

我想使用awk用文件名替换文件中的第5列 我试过这个

abstract class Base {
    public static A: string = "Fallback_A";
    public DoSmthWithClassName(): string {
        return "Fallback_DoSmth";
    }

    constructor(...args: any[]); // overload for type consistency with children
    constructor(x: string)
    { }
}

// typeof any non-abstract child of Base
type BaseType = typeof Base & (new(...args: any[]) => Base);

// decorator, modifies methods and static properties
function ClassDecorator<T extends BaseType>(valueA: string): (value: T) => T {
    return (value: T) => {
        value.prototype.DoSmthWithClassName = () => value.name + ".DoSmth." + value.A;
        value.A = value.name + valueA;
        return value;
    }
}

@ClassDecorator("Foo") // OK
class Child0 extends Base {

}

@ClassDecorator("Foo") // OK
class Child1 extends Base {
    constructor(x: number) {
        super(x.toString());
    }
}

@ClassDecorator("Foo") // Unable to resolve...
class Child2 extends Base {
    static X: number = 0;
}

@ClassDecorator<typeof Child3>("Foo") // OK
class Child3 extends Base {
    static X: number = 0;
}

但我不知道为什么我无法运行它,你知道我的错误在哪里吗? 它不喜欢我的第一行。  我的档案里面就是这样的。
  我的文件名是Balteni_SV_ed2_MT_2016_D_P10_G + C_-4040m。
  也许我必须删除第一行和最后一行?但我有很多像这样的文件。我不想覆盖,但要编辑它,分离是空间。

#!/bin/bash
For i in ls; do
awk '{$5 = "$i"; print}' $i > $i_edit

我想要这样的事情:

PROFILE Balteni_SV_ed2_M TYPE 3           unspecified      m  m
 363923.46104 372500.00000    0              4040.000      Balteni_SV_ed2_MT_20          unspecified
 363780.87963 372530.87963    0              4040.000      Balteni_SV_ed2_MT_20          unspecified
 363750.00000 372535.75894    0              4040.000      Balteni_SV_ed2_MT_20          unspecified
EOD

2 个答案:

答案 0 :(得分:1)

这是另一种方式

for f in *; do awk '{$5=FILENAME}1' "$f" > "$f"_edited; done

跳过第一行添加NR>1限定符并跳过最后一行,您可以检查字段数,例如

for f in *; do awk 'NR>1 && NF>4 {$5=FILENAME}1' "$f" > "$f"_edited; done

答案 1 :(得分:1)

你真正需要的只是:

awk 'FNR==1{close(f); f=FILENAME"_edit"} {$5=FILENAME; print > f}' *

并且您的输入不会修改第一行和最后一行:

awk 'FNR==1{close(f); f=FILENAME"_edit"} FNR>1 && NF>1{$5=FILENAME} {print > f}' *