我试图弄清楚如何将一行中的所有值更改为 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/A
。1
末尾的尾随是一种简短的书写方式{ 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