将一行中的所有值替换为 N/A

将一行中的所有值替换为 N/A

我试图弄清楚如何将一行中的所有值更改为 N/A。例如。我需要将所有列中的第 77 132 140 142 155 156 157 和 175 行替换为 N/A。例如:

RS,RPHG,LPHG,RITC
13.7801604545457,3.10785528409178,-38.443658181819,-8.25890473295385
-12.5663095454547,-33.8395547159089,-3.44606818181819,-24.8157817329538
35.1140204545463,-35.4853647159089,-33.8231881818192,26.6855902670459
-29.9357495454533,-34.5783047159075,-50.3323381818191,2.0808182670462

答案1

$ awk -F, -vOFS=, 'FNR==2 || FNR==4 { for (i=1;i<=NF;++i) $i="N/A" } 1' file
RS,RPHG,LPHG,RITC
N/A,N/A,N/A,N/A
-12.5663095454547,-33.8395547159089,-3.44606818181819,-24.8157817329538
N/A,N/A,N/A,N/A
-29.9357495454533,-34.5783047159075,-50.3323381818191,2.0808182670462

FNR是当前文件中当前记录的序号(“当前文件中的行号”)。如果是两个或四个,我们循环遍历所有字段(从 1 到NF,字段数量)并将每个字段设置为字符串N/A1末尾的尾随是一种简短的书写方式{ print },将导致打印所有行(修改或未修改)。

如果您有一个附加文件,其中包含应删除的所有行号(每行一个数字):

awk -F, -vOFS=, 'FNR==NR { a[$1]; next }
                 FNR in a { for (i=1;i<=NF;++i) $i="N/A" } 1' lines file

lines带有行号的文件在哪里。

在这里,如果FNR==NR我们正在阅读第一的文件(lines文件)。在这种情况下,我们在数组中创建一个条目a,以行号为键,然后继续下一行。NR是个全部的到目前为止读取的行数,它将等于FNR我们开始从第二个文件读取之前的行数。

如果FNR不等于NR,那么我们正在读取第二文件(file包含数据的文件)。然后我们测试当前行号是否是数组中的键a,如果是,我们将像以前一样替换所有字段N/A

答案2

一种方法是sed

sed '
77c\
N/A,N/A,N/A,N/A
132c\
N/A,N/A,N/A,N/A
140c\
N/A,N/A,N/A,N/A
142c\
N/A,N/A,N/A,N/A
155c\
N/A,N/A,N/A,N/A
156c\
N/A,N/A,N/A,N/A
157c\
N/A,N/A,N/A,N/A
175c\
N/A,N/A,N/A,N/A
' input.csv

答案3

awk两行过滤来演示:

awk 'BEGIN { FS=","; OFS="," } { if( NR == 77 || NR == 132 ) {for( i=1; i<=NF; i++) {$NF="N/A"} }; print }' input

if只需向所有相关行的语句添加更多选项即可。

答案4

使用awk

awk -vOFS=, '{
  if (NR==77 || NR=132 || NR==140 || NR==142 || NR==155 || NR==156 || NR==157 || NR==175)
    $1=$2=$3=$4="N/A"
    print
}' input.csv

要使用输出创建新文件,只需使用 shell>重定向运算符:

awk -vOFS=, '{
      if (NR==77 || NR=132 || NR==140 || NR==142 || NR==155 || NR==156 || NR==157 || NR==175)
        $1=$2=$3=$4="N/A"
        print
    }' input.csv > newfile.csv

相关内容