【问题标题】:awk and substitute semicolon (;) in appointed fieldawk 并在指定字段中替换分号 (;)
【发布时间】:2013-07-10 04:35:36
【问题描述】:

谁能解释一下这个小脚本。

echo -e "\"aa;bb\";cc ;\"dd ;ee\"; 
ff" | awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";",",")}
{print}'

在此脚本字段中由 (;) 分隔,但如果在任何字段中存在一个或多个 (;),则此字段由 "" 包围。它是 CSV-file

因此需要将这个fields中的(;)全部替换,以便进一步解析。

【问题讨论】:

    标签: csv awk gsub


    【解决方案1】:

    echo 打印两行:

    "aa;bb";cc ;"dd ;ee"; 
    ff
    

    用每个双引号分割记录,偶数用逗号替换所有分号 (gsub)。

    所以,第一个记录将是第一个双引号之前的内容,它是一个空白记录,但重要的部分是条件NR%2==0NR 为 1,因此条件为假,gsub() 不会被执行,它将与其ORS 一起打印,因此输出将是双引号。

    对于第二条记录,内容将为aa;bbNR%2==0 将为真,并将替换分号。

    第三条记录内容为;cc ;NR%2==0为假,会被打印出来。

    以此类推,直到文件结束。

    【讨论】:

    • 抱歉,但我不明白为什么“对于第二条记录内容将为 aa;bb,NR%2==0 将为真,并将替换分号。”"对于第三条记录的内容为 ;cc ;,NR%2==0 为假,将被打印。" 分别为 "TRUE" 和 "FALSE"。
    • @Andry:每个双引号分隔每条记录,变量NR表示读取的记录数。所以2 % 2 == 0 为真,3 % 2 == 0 为假。
    • 谢谢,朋友。现在我什么都明白了。
    • 如果你是 awk 方面的专家,你可以帮我在 awk 表达式中引用单引号。例如。 awk 'BEGIN{RS="\"";ORS="\'"} $1'。这不起作用。我在 FreeBSD 上使用 sh 作为 shell。
    • @Andry:你的问题的例子很好。用反斜杠转义它们。 BEGIN 块也是如此。它对我有用,所以我不知道它对你不起作用。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2017-03-13
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多