很抱歉有一个非常基本的问题。如何用一些字符串替换csv文件中的特定列?
e.g。
id, day_model,night_model
===========================
1 , ,
2 ,2_DAY ,
3 ,3_DAY ,3_NIGHT
4 , ,
(4 rows)
我想将第2列和第3列中的任何字符串替换为true 其他人会是假的,但不是1,2行和结束行。
输出:
id, day_model,night_model
===========================
1 ,false ,false
2 ,true ,false
3 ,true ,true
4 ,false ,false
(4 rows)
我尝试的是以下示例代码(仅尝试将字符串替换为" true"在第3列中):
#awk -F, '$3!=""{$3="true"}' OFS=, file.csv > out.csv
但是out.csv是空的。请给我一些指示。 非常感谢!!
答案 0 :(得分:2)
由于您的字段分隔符是逗号,“空”字段可能包含空格,尤其是第二个字段。因此它们可能不等于空字符串。
我会这样做:
awk -F, -v OFS=, '
# ex
NR>2 && !/^\([0-9]+ rows\)/ {
for (i=2; i<=NF; i++)
$i = ($i ~ /[^[:blank:]]/) ? "true" : "false"
}
{ print }
' file
答案 1 :(得分:1)
好了,因为您在标记中添加了sed
并且您只有三列我在四个步骤中为您的问题提供了解决方案,因为一次性所有情况都无法进行正则表达式替换。
由于您的第2和第3列有空格。我写了四个sed
命令来替换每一行。
sed '/^(\d+\s+,)\S+\s*,\S+\s*$/\1true,true/gm' file.txt
这将替换3 ,3_DAY ,3_NIGHT
<强> Regex101 Demo 强>
sed '/^(\d+\s+,)\S+\s*,\s*$/\1true,false/gm' file.txt
这将替换2 ,2_DAY ,
<强> Regex101 Demo 强>
sed '/^(\d+\s+,)\s*,\S+\s*$/\1false,true/gm' file.txt
这将替换5 , ,2_Day
<强> Regex101 Demo 强>
sed '/^(\d+\s+,)\s*,\s*$/\1false,false/gm' file.txt
这将替换1 , ,
<强> Regex101 Demo 强>