如何使用sed或awk替换csv文件中的字符串

时间:2016-03-22 16:15:00

标签: regex bash awk sed

很抱歉有一个非常基本的问题。如何用一些字符串替换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是空的。请给我一些指示。 非常感谢!!

2 个答案:

答案 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命令来替换每一行。

  1. sed '/^(\d+\s+,)\S+\s*,\S+\s*$/\1true,true/gm' file.txt

    这将替换3 ,3_DAY ,3_NIGHT

    之类的行

    <强> Regex101 Demo

  2. sed '/^(\d+\s+,)\S+\s*,\s*$/\1true,false/gm' file.txt

    这将替换2 ,2_DAY ,

    之类的行

    <强> Regex101 Demo

  3. sed '/^(\d+\s+,)\s*,\S+\s*$/\1false,true/gm' file.txt

    这将替换5 , ,2_Day

    之类的行

    <强> Regex101 Demo

  4. sed '/^(\d+\s+,)\s*,\s*$/\1false,false/gm' file.txt

    这将替换1 , ,

    之类的行

    <强> Regex101 Demo