【问题标题】:How can I prevent awk from appending newlines to a match如何防止 awk 将换行符附加到匹配项
【发布时间】:2011-11-14 06:47:44
【问题描述】:

我正在编写一个 bash 脚本来解析制表符分隔的文本文件中的一些字段,并将它们附加到文件本身的文件名中。我可以使用 awk 很好地解析这些字段,但它们附带了一个换行符。我想要么从结果中删除那些换行符,要么理想地阻止 awk 首先附加它们。示例代码,现在仅从存储的字符串中回显:

#!/bin/bash
echo "Usage: sh extract.sh filename.txt (or *.txt)"

for filenam in "$@"
do
timestring=$(awk 'BEGIN{ FS="\t"; RS="\n"; ORS="_"; OFS="_"}
    /Conditions/ {printf $2}
    /Date/ {printf $2}
    /Time/ {printf $2}
    END {}' $filenam)
echo $timestring

done

目前,每次找到匹配项时,它都会覆盖任何以前的匹配项,因为 \n 附加到字符串的末尾。我该如何防止呢? (这样我就有 conditions_date_time 作为字符串,没有任何换行符)。

很抱歉,这似乎是一个简单的问题,但我已经搜索了几个小时并尝试了各种方法,但我很困惑。谢谢!

【问题讨论】:

    标签: bash scripting awk


    【解决方案1】:

    试试类似的东西

    #!/bin/bash
    echo "Usage: sh extract.sh filename.txt (or *.txt)"
    
    for filenam in "$@"
    do
    timestring=$(awk 'BEGIN{ FS="\t"; RS="\n"; ORS="_"; OFS="_"}
        /Conditions/ { cond=$2 }
        /Date/ { date=$2 }
        /Time/ { time=$2 }
        { if (length(cond) && length(date) && length(time)) {
              print cond "_" date "_" time;
              cond = ""; date=""; time=""
          }
        }
        END {}' $filenam)
    echo $timestring
    
    done
    

    它未经测试,但你应该明白。

    【讨论】:

      【解决方案2】:

      在您的脚本中,使用 print 而不是 printf,例如print $2.

      至于覆盖,如果您正在处理的文本文件具有\r\n 行结尾,而不是\n,则可能会发生这种情况。如果是这种情况,请将输入记录分隔符设置为 \r\n,例如RS="\r\n".

      【讨论】:

      • 这正是线路终止\r\n,非常感谢您的洞察力!我应该知道输入必须很简单,我在谷歌上搜索并尝试了几个小时的示例代码。再次感谢!
      【解决方案3】:

      在您将文件传递给awk 之前,请在您的文件上执行dos2unix

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 2015-05-17
        • 2014-08-10
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多