Unix Awk命令对除第一行和最后一行以外的行执行操作

Unix Awk命令对除第一行和最后一行以外的行执行操作,unix,awk,Unix,Awk,我在特定目录中有多个csv格式的MS excel文件。 我想更新csv文件所有行中一个特定列的值 此外,该动作不应在第一行和最后一行操作。 到目前为止,我已经为一行找到了以下代码: awk -F, 'NR>2{$2=300;}1' OFS=, test.csv 但我在排除最后一行时遇到了困难。 另外,我需要对目录中的所有文件执行相同的操作 到目前为止,尝试了以下方法,但未能成功使用awk替换该字符串值。 一, 二, 这可以做到: awk -F, 't{print t} {a=t=$0}

我在特定目录中有多个csv格式的MS excel文件。 我想更新csv文件所有行中一个特定列的值

此外,该动作不应在第一行和最后一行操作。 到目前为止,我已经为一行找到了以下代码:

awk -F, 'NR>2{$2=300;}1' OFS=, test.csv
但我在排除最后一行时遇到了困难。 另外,我需要对目录中的所有文件执行相同的操作

到目前为止,尝试了以下方法,但未能成功使用awk替换该字符串值。 一,

二,

这可以做到:

awk -F, 't{print t} {a=t=$0} NR>1{$2=300;t=$0} END {print a}' OFS=, test.csv
这可以做到:

awk -F, 't{print t} {a=t=$0} NR>1{$2=300;t=$0} END {print a}' OFS=, test.csv

通过读取两次文件,可以稍微简化脚本:

awk 'BEGIN{FS=OFS=","} NR==FNR {c=NR;next} !(FNR==1||FNR==c){$2=200} 1' file file
这仅使用NR==FNR部分来计算行数,为您提供了一个简单的表达式来确定是否更新相关字段

如果您有GNU awk可用,您可以通过不为每一行重新分配c变量来节省一些CPU周期,方法如下:

gawk 'BEGIN{FS=OFS=","} ENDFILE {c=FNR} NR==FNR{next} !(FNR==1||FNR==c){$2=200} 1' file file
这仍然会读取文件两次,但仅在读取每个文件后才分配c

如果需要,可以使用NR>FNR&&FNR==1模拟非GNU awk中的ENDFILE条件(如果只有两个文件),然后设置c=NR-1。它不会有那么好的表现


我还没有测试这两个文件之间的速度差异,但我怀疑除了非常大的文件外,速度差异可以忽略不计。

您可以通过读取两次文件来简化脚本:

awk 'BEGIN{FS=OFS=","} NR==FNR {c=NR;next} !(FNR==1||FNR==c){$2=200} 1' file file
这仅使用NR==FNR部分来计算行数,为您提供了一个简单的表达式来确定是否更新相关字段

如果您有GNU awk可用,您可以通过不为每一行重新分配c变量来节省一些CPU周期,方法如下:

gawk 'BEGIN{FS=OFS=","} ENDFILE {c=FNR} NR==FNR{next} !(FNR==1||FNR==c){$2=200} 1' file file
这仍然会读取文件两次,但仅在读取每个文件后才分配c

如果需要,可以使用NR>FNR&&FNR==1模拟非GNU awk中的ENDFILE条件(如果只有两个文件),然后设置c=NR-1。它不会有那么好的表现

我还没有测试这两个文件之间的速度差异,但我怀疑它可以忽略不计,除非是真正的大文件。

谢谢大家, 我必须让它工作。以下是命令:

awk-vsq=-F,'t{print t t}{a=t=$0}NR>2{$3=sqops_datasq;t=$0}END{print a}'OFS=,test1.csv

谢谢大家, 我必须让它工作。以下是命令:



awk-vsq=-F,'t{print t t}{a=t=$0}NR>2{$3=sqops_datasq;t=$0}END{print a}'OFS=,test1.csv

好主意。如果您的文件很大,则更有效:awk-vc=$wc-l1&&NR@ghoti我试着使用下面的命令:--awk-F,'t{print t t}{a=t=$0}NR>2{$3='ops_-dat\';t=$0}END{print a}'OFS=,test1.csv--仍然有错误。@user3901666,关于这个解决方案,也许你应该问问Jotne。如果您遇到错误,也许您可以更新您的问题,以包括尝试的详细信息以及错误。问题中的格式比注释中的格式好得多。哦,注意你的语录。从这里看,你似乎试图在单引号字符串中包含单引号,这当然行不通。是的,我也搜索了谷歌,但找不到任何明确的解决方案。根据你的更新,正如我所建议的,你应该在单引号脚本中切换到双引号。好主意。如果您的文件很大,则更有效:awk-vc=$wc-l1&&NR@ghoti我试着使用下面的命令:--awk-F,'t{print t t}{a=t=$0}NR>2{$3='ops_-dat\';t=$0}END{print a}'OFS=,test1.csv--仍然有错误。@user3901666,关于这个解决方案,也许你应该问问Jotne。如果您遇到错误,也许您可以更新您的问题,以包括尝试的详细信息以及错误。问题中的格式比注释中的格式好得多。哦,注意你的语录。从这里看,你似乎试图在单引号字符串中包含单引号,这当然行不通。是的,我也搜索了谷歌,但我找不到任何明确的解决方案。根据你的更新,正如我所建议的,您应该在单引号脚本中为赋值切换到双引号,test1.csv-sh:dbms=TD::instance=idw prod:没有这样的文件或目录您应该向建议该脚本的人询问您在执行脚本时遇到的任何错误。是的,我问了。我也试过你的剧本,但对我提到的案例也不起作用。你问了一个问题,我回答了。如果你有一个新问题,那么请随时发布它谢谢。是的,我当然会。我正在尝试使用下面的方法,但得到了错误:awk-F,'t{print t t}{a=t=$0}NR>1{$3='ops_dat';t=$0}END{print a}'OFS=,test1.csv-sh:dbms=TD::instance=idw prod:没有这样的文件或目录您应该向建议该脚本的人询问您在执行脚本时遇到的任何错误。是的,我问了。我试过你的纸条
当然,这对我提到的案例也不起作用。你问了一个问题,我回答了。如果你有一个新的问题,那么请随意发帖谢谢。是的,我当然会。我正在尝试使用下面的方法,但是得到了错误:awk-F,'t{print t t}{a=t=$0}NR>1{$3='ops_-dat';t=$0}END{print a}'OFS=,test1.csv-sh:dbms=TD::instance=idw prod:没有这样的文件或directory@user3901666因为awk是用单引号括起来的,您不能在awk中使用单引号,因此这将失败$3='ops\u da。。。。做一个关于如何在awk搜索中使用单引号的谷歌搜索。我试图使用下面的方法,但得到了错误:awk-F,'t{print t t}{a=t=$0}NR>1{$3='ops_dat';t=$0}END{print a}'OFS=,test1.csv-sh:dbms=TD::instance=idw prod:没有这样的文件或directory@user3901666由于awk由单引号包装,因此不能在awk中使用单引号,因此,这将失败$3='ops\u da。。。。在谷歌上搜索如何在awk搜索中使用单引号。