awk将列名更改为文件名

awk将列名更改为文件名,awk,Awk,我想使用awk将文件中的第5列替换为文件名 我试过这个 #!/bin/bash For i in ls; do awk '{$5 = "$i"; print}' $i > $i_edit 但是我不知道为什么我不能运行它,你知道我的错误在哪里吗? 它不喜欢我的第一行。 我的文件里面是这样的。 我的文件名为Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m。 也许我必须删除第一行和最后一行?但是我有很多这样的文件。我不想覆盖,但编辑它,间隔是空间 PROFILE

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

#!/bin/bash
For i in ls; do
awk '{$5 = "$i"; print}' $i > $i_edit
但是我不知道为什么我不能运行它,你知道我的错误在哪里吗? 它不喜欢我的第一行。 我的文件里面是这样的。
我的文件名为Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m。
也许我必须删除第一行和最后一行?但是我有很多这样的文件。我不想覆盖,但编辑它,间隔是空间

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
我想要这样的东西:

PROFILE Balteni_SV_ed2_M TYPE 3           unspecified      m  m
363923.46104 372500.00000    0              4040.000      Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m          unspecified
363780.87963 372530.87963    0              4040.000      Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m          unspecified
363750.00000 372535.75894    0              4040.000      Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m          unspecified
EOD
这是另一种方法

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
这是另一种方法

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

您真正需要的是:

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}' *

您真正需要的是:

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}' *

你想对每个文件都这样做吗?您正在尝试覆盖原始文件吗?这些文件看起来像什么?请回答您的问题以提供更多详细信息。请注意,For的
和For
是不同的,For
循环以
done
结尾。这就是您的输入,输出应该是什么样的?这些字段是固定宽度的,还是制表符分隔的,还是其他什么?awk不卖<代码>i
在awk脚本之外是一个shell变量<代码>i在awk脚本中是一个awk变量。除了有一个公共名称之外,这些文件彼此完全无关。是否要对每个文件都这样做?您正在尝试覆盖原始文件吗?这些文件看起来像什么?请回答您的问题以提供更多详细信息。请注意,For的
和For
是不同的,For
循环以
done
结尾。这就是您的输入,输出应该是什么样的?这些字段是固定宽度的,还是制表符分隔的,还是其他什么?awk不卖<代码>i
在awk脚本之外是一个shell变量<代码>i在awk脚本中是一个awk变量。除了有一个共同的名称外,这些代码彼此完全无关。我认为这不会产生预期的输出。您是指第一行/最后一行条件吗?我更新了答案。是的,但这也会压缩文件中的空白。请注意,您也可以在awk中使用
print>(FILENAME“\u edited”)
跳过shell循环。是的,您是对的,这会折叠文件中的空白。但在我的情况下,这不是很重要,我不认为这会产生预期的输出。你是指第一行/最后一行条件吗?我更新了答案。是的,但这也会压缩文件中的空白。请注意,您也可以在awk中使用
print>(FILENAME“\u edited”)
跳过shell循环。是的,您是对的,这会折叠文件中的空白。但对我来说,这并不重要