unix - 根据列的值更改文件中某些字段的值
问题描述
我有一个由逗号分隔的文件,它有大约 50 列,可以达到 1M 行。
我想评估每一行的某些列,如 5、41、42、43、44、45、46、47、48、49 和 50 是否具有 Y|N|N/A 的值,如果没有,它将替换为另一个值,例如 E。我在该过程中使用 awk:
okfile="okfile"
awk -F, -v okfile="$okfile" '
BEGIN {system("rm -f " okfile) }
length > 0 {
if (toupper($5) !~ /YES|NO|N\/A/ ) { $5="E",$0 >> okfile;numerr+=1;next }
for (i=41;i<=50;i++)
{ if (toupper($i) !~ /YES|NO|N\/A/)
{
$i="E",$0 >> okfile
numerr+=1
next
}
}
}
END {print numerr,"errors"}
' FILETOREAD.txt
这总是给我语法错误,我无法解决它:
syntax error The source line is 5.
The error context is
if_(toupper($5) !~ /YES|NO|N\/A/ { >>> {$5="E", <<<
awk: The statement cannot be correctly parsed.
The source line is 5.
任何人都可以帮助我吗?
编辑第 5 行,最后出现拼写错误,使用 ) 而不是 }
解决方案
我认为这可能是你想要做的(未经测试):
okfile="okfile"
awk '
BEGIN {
FS=OFS=","
flds[++numFlds] = 5
for (i=41; i<=50; i++) {
flds[++numFlds] = i
}
}
NF {
for ( n=1; n<=numFlds; n++ ) {
i = flds[n]
if ( toupper($i) !~ /^(YES|NO|N\/A)$/ ) {
$j = "E"
numerr++
}
}
print
}
END { print numerr+0, "errors" | "cat>&2" }
' FILETOREAD.txt > "$okfile"
推荐阅读
- java - Spring 应用程序在 intellij 中运行,但 java -jar 没有
- python - 如何从纯文本文件中读取随机字符
- robotframework - 如何过滤掉机器人框架报告中的预期错误?
- python - python中的长长整数
- java - 带有非空字符串的“java.lang.NumberFormatException:空字符串”
- python - 如何在 Keras CNN 中对齐维度以使输出与自定义损失函数匹配?
- java - 如何使用 Lucene 将小写应用于字符串
- r - 如何对 R 中的第一列(行名)进行子集化
- python - 如何通过函数返回从 VAR 获取 INT 或 STR?
- c++ - 如何在移动滑块的同时连续加载和显示多个图像?