Unix Awk命令对除第一行和最后一行以外的行执行操作
我在特定目录中有多个csv格式的MS excel文件。 我想更新csv文件所有行中一个特定列的值 此外,该动作不应在第一行和最后一行操作。 到目前为止,我已经为一行找到了以下代码: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}
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-l
当然,这对我提到的案例也不起作用。你问了一个问题,我回答了。如果你有一个新的问题,那么请随意发帖谢谢。是的,我当然会。我正在尝试使用下面的方法,但是得到了错误: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搜索中使用单引号。